|
|
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
|
|
|
{
|
|
|
/// <summary>
|
|
|
/// 向指定数据库的指定表中,插入一条数据。
|
|
|
/// <para>数据的Key为字段,Value为字段对应的值</para>
|
|
|
/// </summary>
|
|
|
/// <param name="database">数据库名(在fbembed.dll所在目录;或者是绝对路径+数据库名)</param>
|
|
|
/// <param name="tableName">表名</param>
|
|
|
/// <param name="fieldsValues">一条数据的信息</param>
|
|
|
public static void Insert(string database, string tableName, IDictionary<string, object> fieldsValues)
|
|
|
{
|
|
|
var insertSql = SqlUtil.GetInsertSql(tableName, fieldsValues);
|
|
|
using (FbConnection conn = new FbConnection(GetConnectionString(database))) {
|
|
|
conn.Open();
|
|
|
SqlExecuteBaseUtil.ExecuteNonQuery(conn, null, insertSql);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 删除符合条件的数据
|
|
|
/// </summary>
|
|
|
/// <param name="database">数据库名(在fbembed.dll所在目录;或者是绝对路径+数据库名)</param>
|
|
|
/// <param name="tableName">表名</param>
|
|
|
/// <param name="conditions">以where打头的条件</param>
|
|
|
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);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 更新符合条件的数据
|
|
|
/// </summary>
|
|
|
/// <param name="database">数据库名(在fbembed.dll所在目录;或者是绝对路径+数据库名)</param>
|
|
|
/// <param name="tableName">表名</param>
|
|
|
/// <param name="newValues">新值:Key为字段名,Value为新值</param>
|
|
|
/// <param name="conditions">以where打头的条件</param>
|
|
|
public static void Update(string database, string tableName, Dictionary<string, object> newValues, string conditions)
|
|
|
{
|
|
|
var updateSql = SqlUtil.GetUpdateSql(tableName, newValues, conditions);
|
|
|
using (FbConnection conn = new FbConnection(GetConnectionString(database))) {
|
|
|
conn.Open();
|
|
|
SqlExecuteBaseUtil.ExecuteNonQuery(conn, null, updateSql);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 数据库是否存在
|
|
|
/// </summary>
|
|
|
/// <param name="database">数据库名(在fbembed.dll所在目录;或者是绝对路径+数据库名)</param>
|
|
|
public static bool IsDatabaseExist(string database)
|
|
|
{
|
|
|
return File.Exists(database);
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 如果指定数据库中,不存在指定的表,则根据创建表的参数,创建之
|
|
|
/// </summary>
|
|
|
/// <param name="database">数据库名(在fbembed.dll所在目录;或者是绝对路径+数据库名)</param>
|
|
|
/// <param name="tableName">表名</param>
|
|
|
/// <param name="tableParams">创建表的字段的相关参数信息</param>
|
|
|
public static void CreateTableIfNotExist(string database, string tableName, string tableParams)
|
|
|
{
|
|
|
if (IsTableExist(database, tableName))
|
|
|
return;
|
|
|
CreateTable(database, tableName, tableParams);
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 在指定数据库中,判断表是否存在
|
|
|
/// </summary>
|
|
|
/// <param name="database">数据库名(在fbembed.dll所在目录;或者是绝对路径+数据库名)</param>
|
|
|
/// <param name="tableName">表名</param>
|
|
|
public static bool IsTableExist(string database, string tableName)
|
|
|
{
|
|
|
bool exist = false;
|
|
|
using (FbConnection conn = new FbConnection(GetConnectionString(database))) {
|
|
|
conn.Open();
|
|
|
exist = SqlExecuteBaseUtil.ExecuteScalar<bool>(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;
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 在指定数据库中,创建数据表
|
|
|
/// </summary>
|
|
|
/// <param name="database">数据库名(在fbembed.dll所在目录;或者是绝对路径+数据库名)</param>
|
|
|
/// <param name="tableName">表名</param>
|
|
|
/// <param name="tableParams">创建表的字段的相关参数信息</param>
|
|
|
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();
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 如果数据库不存在,则创建数据库
|
|
|
/// </summary>
|
|
|
/// <param name="database">数据库名(在fbembed.dll所在目录;或者是绝对路径+数据库名)</param>
|
|
|
public static void CreateDataBaseIfNotExist(string database)
|
|
|
{
|
|
|
if (!File.Exists(database))
|
|
|
FbConnection.CreateDatabase(GetConnectionString(database));
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 获取连接字符串
|
|
|
/// </summary>
|
|
|
/// <param name="database">数据库名(在fbembed.dll所在目录;或者是绝对路径+数据库名)</param>
|
|
|
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 注销的代码:插入数据。注销原因:要求数据的顺序与数据表的顺序一致
|
|
|
///// <summary>
|
|
|
///// 向指定数据库的指定表中,插入一条数据。
|
|
|
///// <para>fields为字段,values为与字段对应的值</para>
|
|
|
///// </summary>
|
|
|
///// <param name="database">数据库名(在fbembed.dll所在目录;或者是绝对路径+数据库名)</param>
|
|
|
///// <param name="tableName">表名</param>
|
|
|
///// <param name="fields">一条数据的字段信息,与值信息一一对应</param>
|
|
|
///// <param name="values">一条数据的值信息,与字段信息一一对应</param>
|
|
|
//public static void Insert(string database, string tableName, IList<string> fields, IList<object> values)
|
|
|
//{
|
|
|
// var preparedParams = PrepareInsertSQLParams(fields, values);
|
|
|
// InsertPrepared(database, tableName, preparedParams);
|
|
|
//}
|
|
|
|
|
|
///// <summary>
|
|
|
///// 向指定数据库的指定表中,插入一条数据。
|
|
|
///// <para>数据的Key为字段,Value为字段对应的值</para>
|
|
|
///// </summary>
|
|
|
///// <param name="database">数据库名(在fbembed.dll所在目录;或者是绝对路径+数据库名)</param>
|
|
|
///// <param name="tableName">表名</param>
|
|
|
///// <param name="fieldsValues">一条数据的信息</param>
|
|
|
//public static void Insert(string database, string tableName, IDictionary<string, object> fieldsValues)
|
|
|
//{
|
|
|
// var preparedParams = PrepareInsertSQLParams(fieldsValues);
|
|
|
// InsertPrepared(database, tableName, preparedParams);
|
|
|
//}
|
|
|
|
|
|
///// <summary>
|
|
|
///// 向指定数据库的指定表中,插入一条数据。
|
|
|
///// <para>数据的Key为字段对应的变量名(字段前加@),Value为字段对应的值</para>
|
|
|
///// </summary>
|
|
|
///// <param name="database">数据库名(在fbembed.dll所在目录;或者是绝对路径+数据库名)</param>
|
|
|
///// <param name="tableName">表名</param>
|
|
|
///// <param name="fieldsValues">一条数据的信息,是经过处理的</param>
|
|
|
//private static void InsertPrepared(string database, string tableName, IDictionary<string, object> 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();
|
|
|
// }
|
|
|
// }
|
|
|
//}
|
|
|
|
|
|
// /// <summary>
|
|
|
// /// 获取插入数据参数,key为变量名,value为值。
|
|
|
// /// <para>在字段名前加@,使其成为变量名</para>
|
|
|
// /// </summary>
|
|
|
// private static IDictionary<string, object> PrepareInsertSQLParams(IList<string> fields, IList<object> values)
|
|
|
// {
|
|
|
//#if DEBUG
|
|
|
// if (fields == null || values == null)
|
|
|
// throw new ApplicationException("没有初始化参数");
|
|
|
// if (fields.Count != values.Count)
|
|
|
// throw new ApplicationException("字段与值的数量不匹配");
|
|
|
//#endif
|
|
|
// Dictionary<string, object> paramS = new Dictionary<string, object>();
|
|
|
// for (int i = 0; i < fields.Count; i++)
|
|
|
// paramS.Add("@" + fields[i], values[i]);
|
|
|
// return paramS;
|
|
|
// }
|
|
|
|
|
|
// /// <summary>
|
|
|
// /// 获取插入数据参数,key为变量名,value为值。
|
|
|
// /// <para>在字段名前加@,使其成为变量名</para>
|
|
|
// /// </summary>
|
|
|
// private static IDictionary<string, object> PrepareInsertSQLParams(IDictionary<string, object> fieldsValues)
|
|
|
// {
|
|
|
//#if DEBUG
|
|
|
// if (fieldsValues == null || fieldsValues.Count == 0)//TODO:为0时,是否要特殊处理?即不执行插入操作
|
|
|
// throw new ApplicationException("没有初始化参数");
|
|
|
//#endif
|
|
|
// Dictionary<string, object> paramS = new Dictionary<string, object>();
|
|
|
// foreach (var item in fieldsValues)
|
|
|
// paramS.Add("@" + item.Key, item.Value);
|
|
|
// return paramS;
|
|
|
// }
|
|
|
#endregion
|
|
|
|
|
|
}
|
|
|
}
|