通用的 SqlBuilder 类 (SQL Server, Access, MySQL, SQLite 等)






2.25/5 (3投票s)
SqlBuilder 类可以自动化并简化数据库操作。
引言
这是一个非常简单且有用的 SqlBuilder
类。它可以节省编写代码的时间。
背景
我被为我的小型数据库应用程序生成大量 SQL 代码所困扰。因此,我设计了一种通用的机制来操作数据库(使用 ADO 2.0)。
使用代码
以下是一些 SqlBuilder
类用法的示例
SqlBuilder builder = SqlBuilder.Instance;
//build connection string
string cur_dir = Path.GetDirectoryName(
System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName);
string db_path = string.Format("{0}\\my_db.db3", cur_dir);
string connection =
string.Format("Data Source={0};Version=3;New=True;Compress=True;",
db_path);
//connect to a specific database
SqlBuilder.Instance.connect(new SqliteDbFactory(), connection);
Test test = new Test();
//Verify whether table exists - if not create from the object 'test'
builder.verifyTableExists(test);
//insert new record
test.Name = "Joe";
test.Number = 124.56f;
builder.insert(test);
//select record
test.Id = 1;
builder.select(test);
//update record
test.Name = "Rob";
test.Number = 12345.56f;
builder.update(test);
//Get insert string
builder.getInsert(test);
//Get update string
builder.getUpdate(test);
//Get delete string
builder.getDelete(test);
//Get select string
builder.getSelect(test);
//Get CreateTable string
builder.getCreateTable(test);
//Build list of test objects
List<Test> list = new List<Test>();
for (int i = 0; i < 10; i++)
{
Test t = new Test();
t.Name = string.Format("test{0}", i);
t.Number = i;
}
//insert list into database
builder.insert(list);
//select list from database
list.Clear();
builder.select(list, new Test());//equivalent to select * from tblTest
//another select list
builder.select(list, new Test(), "select Name,Number from tblTest");
//Autosynchronization mechanism
Test test = new Test();
test.Name = "dog";
test.Number = 15;
builder.insert(test);
builder.OnSynchronized += new OnSynchronizedD(OnSynchronized);
int key = builder.addSynchObject(test, SynchType.SELECT);
builder.startSynchronization(true, 1000);
builder.startSynchronization(false, 0);
builder.deleteSynchObject(key);
public void OnSynchronized(SynchObject obj)
{
Test t = (Test)obj.SynchronizationObject;
}
// Some database object
[dbTable("tblTest")]
class Test
{
private int m_Id;
private string m_Name;
private double m_Number;
[db(true,true,true,"")]
public int Id
{
get { return m_Id; }
set { m_Id = value; }
}
[db(false, false, false, "")]
public string Name
{
get { return m_Name; }
set { m_Name = value; }
}
[db(false, false, false, "")]
public double Number
{
get { return m_Number; }
set { m_Number = value; }
}
//This interface must be implemented and passed
//to the SQLBuilder so it can work
//with specified database type
public interface IDBFactory
{
IDbConnection CreateConnection(string connection_string);
string NetTypeToDBType(string netType);
bool IsTableExist(string data);
}
//One of the possible implementation is for the Sqlite database
public class SqliteDbFactory : IDBFactory
{
IDbConnection m_Connection;
#region IDBFactory Members
IDbConnection IDBFactory.CreateConnection(string connection_string)
{
m_Connection = new SQLiteConnection(connection_string);
return m_Connection;
}
string IDBFactory.NetTypeToDBType(string netType)
{
switch (netType)
{
case "string":
return "text";
case "double":
case "float":
case "single":
return "float";
case "int16":
case "int32":
case "int64":
case "uint16":
case "uint32":
case "uint64":
case "boolean":
case "byte":
return "integer";
case "datetime":
return "datetime";
default:
return "integer";
}
}
bool IDBFactory.IsTableExist(string data)
{
using(IDbCommand cmd = m_Connection.CreateCommand())
{
cmd.CommandText = data;
using (IDataReader reader = cmd.ExecuteReader())
{
if (reader.Read())
{
return reader.GetInt32(0) > 0;
}
reader.Close();
}
}
throw new DataException("It shouldn't be here");
}
#endregion
}
}
历史
最初我创建了一个 SqliteBuilder
,但在收到一些评论后,我设计了一个通用的 SqlBuilder
类,它可以与任何支持 ADO 接口的数据库类型一起工作。
添加的功能
这些新方法是后来添加的
string getTableXml(string table_name);
string getTableXml(object obj);
//get xml of table correspondent to the object obj