using System; using System.Collections.Generic; using System.Linq; using System.Text; using FirebirdSql.Data.FirebirdClient; using System.IO; using System.Runtime.InteropServices; namespace FireBirdUtil.SqlUtils { public static class SQLExecuteUtil { /// /// 向指定数据库的指定表中,插入一条数据。 /// 数据的Key为字段,Value为字段对应的值 /// /// 数据库名(在fbembed.dll所在目录;或者是绝对路径+数据库名) /// 表名 /// 一条数据的信息 public static void Insert(string database, string tableName, IDictionary fieldsValues) { var insertSql = SqlUtil.GetInsertSql(tableName, fieldsValues); using (FbConnection conn = new FbConnection(GetConnectionString(database))) { conn.Open(); SqlExecuteBaseUtil.ExecuteNonQuery(conn, null, insertSql); } } /// /// 删除符合条件的数据 /// /// 数据库名(在fbembed.dll所在目录;或者是绝对路径+数据库名) /// 表名 /// 以where打头的条件 public static void Delete(string database, string tableName, string conditions) { var deleteSql = SqlUtil.GetDeleteSql(tableName, conditions); using (FbConnection conn = new FbConnection(GetConnectionString(database))) { conn.Open(); SqlExecuteBaseUtil.ExecuteNonQuery(conn, null, deleteSql); } } /// /// 更新符合条件的数据 /// /// 数据库名(在fbembed.dll所在目录;或者是绝对路径+数据库名) /// 表名 /// 新值:Key为字段名,Value为新值 /// 以where打头的条件 public static void Update(string database, string tableName, Dictionary newValues, string conditions) { var updateSql = SqlUtil.GetUpdateSql(tableName, newValues, conditions); using (FbConnection conn = new FbConnection(GetConnectionString(database))) { conn.Open(); SqlExecuteBaseUtil.ExecuteNonQuery(conn, null, updateSql); } } /// /// 数据库是否存在 /// /// 数据库名(在fbembed.dll所在目录;或者是绝对路径+数据库名) public static bool IsDatabaseExist(string database) { return File.Exists(database); } /// /// 如果指定数据库中,不存在指定的表,则根据创建表的参数,创建之 /// /// 数据库名(在fbembed.dll所在目录;或者是绝对路径+数据库名) /// 表名 /// 创建表的字段的相关参数信息 public static void CreateTableIfNotExist(string database, string tableName, string tableParams) { if (IsTableExist(database, tableName)) return; CreateTable(database, tableName, tableParams); } /// /// 在指定数据库中,判断表是否存在 /// /// 数据库名(在fbembed.dll所在目录;或者是绝对路径+数据库名) /// 表名 public static bool IsTableExist(string database, string tableName) { bool exist = false; using (FbConnection conn = new FbConnection(GetConnectionString(database))) { conn.Open(); exist = SqlExecuteBaseUtil.ExecuteScalar(conn, null, SqlUtil.GetJudgeTableExistSql(tableName), obj => { int count = 0; if (obj.Equals(null) || obj.Equals(System.DBNull.Value)) { count = -1; } else { count = (int)obj; } return count > 0; }); } return exist; } /// /// 在指定数据库中,创建数据表 /// /// 数据库名(在fbembed.dll所在目录;或者是绝对路径+数据库名) /// 表名 /// 创建表的字段的相关参数信息 public static void CreateTable(string database, string tableName, string tableParams) { FbConnection cn = new FbConnection(GetConnectionString(database)); cn.Open(); string strSQL = SqlUtil.GetCreateTableSql(tableName, tableParams); SqlExecuteBaseUtil.ExecuteNonQuery(cn, null, strSQL); cn.Close(); } /// /// 如果数据库不存在,则创建数据库 /// /// 数据库名(在fbembed.dll所在目录;或者是绝对路径+数据库名) public static void CreateDataBaseIfNotExist(string database) { if (!File.Exists(database)) FbConnection.CreateDatabase(GetConnectionString(database)); } /// /// 获取连接字符串 /// /// 数据库名(在fbembed.dll所在目录;或者是绝对路径+数据库名) public static string GetConnectionString(string database) { FbConnectionStringBuilder cs = new FbConnectionStringBuilder(); cs.Database = database; cs.UserID = "SYSDBA"; cs.Password = "masterkey"; cs.Charset = "UTF8"; cs.ServerType = FbServerType.Embedded; return cs.ToString(); } #region 注销的代码:插入数据。注销原因:要求数据的顺序与数据表的顺序一致 ///// ///// 向指定数据库的指定表中,插入一条数据。 ///// fields为字段,values为与字段对应的值 ///// ///// 数据库名(在fbembed.dll所在目录;或者是绝对路径+数据库名) ///// 表名 ///// 一条数据的字段信息,与值信息一一对应 ///// 一条数据的值信息,与字段信息一一对应 //public static void Insert(string database, string tableName, IList fields, IList values) //{ // var preparedParams = PrepareInsertSQLParams(fields, values); // InsertPrepared(database, tableName, preparedParams); //} ///// ///// 向指定数据库的指定表中,插入一条数据。 ///// 数据的Key为字段,Value为字段对应的值 ///// ///// 数据库名(在fbembed.dll所在目录;或者是绝对路径+数据库名) ///// 表名 ///// 一条数据的信息 //public static void Insert(string database, string tableName, IDictionary fieldsValues) //{ // var preparedParams = PrepareInsertSQLParams(fieldsValues); // InsertPrepared(database, tableName, preparedParams); //} ///// ///// 向指定数据库的指定表中,插入一条数据。 ///// 数据的Key为字段对应的变量名(字段前加@),Value为字段对应的值 ///// ///// 数据库名(在fbembed.dll所在目录;或者是绝对路径+数据库名) ///// 表名 ///// 一条数据的信息,是经过处理的 //private static void InsertPrepared(string database, string tableName, IDictionary fieldsValues) //{ // string insertString = "insert into {0} values ({1})";//"insert into tb_user values (@id, @word)" // insertString = string.Format(insertString, tableName, string.Join(", ", fieldsValues.Keys)); // using (FbConnection conn = new FbConnection(GetConnectionString(database))) { // conn.Open(); // using (FbCommand insertData = conn.CreateCommand()) { // insertData.CommandText = insertString; // insertData.Parameters.Clear(); // foreach (var item in fieldsValues) { // insertData.Parameters.AddWithValue(item.Key, item.Value); // } // insertData.ExecuteNonQuery(); // } // } //} // /// // /// 获取插入数据参数,key为变量名,value为值。 // /// 在字段名前加@,使其成为变量名 // /// // private static IDictionary PrepareInsertSQLParams(IList fields, IList values) // { //#if DEBUG // if (fields == null || values == null) // throw new ApplicationException("没有初始化参数"); // if (fields.Count != values.Count) // throw new ApplicationException("字段与值的数量不匹配"); //#endif // Dictionary paramS = new Dictionary(); // for (int i = 0; i < fields.Count; i++) // paramS.Add("@" + fields[i], values[i]); // return paramS; // } // /// // /// 获取插入数据参数,key为变量名,value为值。 // /// 在字段名前加@,使其成为变量名 // /// // private static IDictionary PrepareInsertSQLParams(IDictionary fieldsValues) // { //#if DEBUG // if (fieldsValues == null || fieldsValues.Count == 0)//TODO:为0时,是否要特殊处理?即不执行插入操作 // throw new ApplicationException("没有初始化参数"); //#endif // Dictionary paramS = new Dictionary(); // foreach (var item in fieldsValues) // paramS.Add("@" + item.Key, item.Value); // return paramS; // } #endregion } }