You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

234 lines
9.6 KiB

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
}
}