Previous topicNext topic
Help > 开发指南 > SanMuGrid平台编程 > 主要对象 > Database >
ADO数据处理
名称 分类 说明
ExecuteDataReader ADO数据处理 执行查询语句,返回IDataReader,当读取数据结束时,一定得记得关闭IDataReader。
ExecuteDataReaderAsync ADO数据处理 执行查询语句,返回IDataReader,当读取数据结束时,一定得记得关闭IDataReader。
ExecuteDataSet ADO数据处理 ExecuteDataSet执行查询语句,返回DataSet
ExecuteDataSetAsync ADO数据处理 ExecuteDataSet执行查询语句,异步返回DataSet
ExecuteDataTable ADO数据处理 执行查询语句,返回DataTable
ExecuteDataTableAsync ADO数据处理 执行查询语句,返回DataTable
ExecuteDataTableHelp ADO数据处理 执行查询语句,返回DataTableHelp
ExecuteDataTableHelpAsync ADO数据处理 执行查询语句,返回DataTableHelp
ExecuteDataTableMap< T> ADO数据处理 直接返回一个空ExecuteDataTableMap,如果需要查询具体的数据,需要通过LoadFilter属性重新定位相应的数据。
ExecuteDataTableMapAsync< T> ADO数据处理 直接返回一个空ExecuteDataTableMap,如果需要查询具体的数据,需要通过LoadFilter属性重新定位相应的数据。
ExecuteNonQuery ADO数据处理 执行sql语句,返回执行条数
ExecuteNonQueryAsync ADO数据处理 执行sql语句,返回执行条数
ExecuteScalar ADO数据处理 执行Sql语句,返回单列
ExecuteScalarAsync ADO数据处理 执行Sql语句,返回单列
FillSchemaOfAutoIncrement ADO数据处理 给Datatable添加主键信息。
GetInstanceCommand ADO数据处理 强行地获得一个Command对象实例。
GetInstanceConnection ADO数据处理 获得一个Connection实例。
GetInstanceDataAdapter ADO数据处理 获得一个DataAdapter实例。
GetInstanceParameter ADO数据处理 返回一个参数的实例。

GetInstanceCommand、GetInstanceConnection、GetInstanceDataAdapter、GetInstanceParameter这几个方法会返回一个根据当前数据源的数据库类型返回相应数据源ADO对象。我们完全可以直接按最原始的ADO.Net的方式来创建对象,这里提供这样的方式主要是为了实现抹除各数据库编码差异的功能,我们完全可以写一套代码来应付所有数据库。后期即便是转换了数据库类型也不至于要修改代码。

Vb.Net
'先获得数据源
Dim db As Database= Proj.SysDataFactory("UserDB")

'示例1:使用一个通用的写法,此写法的好处是可以针对多种数据源使用相同方法
'定义一个命令,用DbCommand类型是方便针对所有数据源使用,主要是通用
Dim cmd As DbCommand=db.GetInstanceCommand()
'定义一个连接
Dim cn As DbConnection=db.GetInstanceConnection()
Proj.MsgDebug.Add("新获得的连接对象字符串:{0}",cn.ConnectionString)
Proj.MsgDebug.Add("新获得的连接对象状态:{0}",cn.State.ToString())
cn.Open()
'初始化命令的参数
cmd.Connection=cn '将创建的数据库连接赋值上
cmd.CommandType=CommandType.Text '设置命令执行的类型
Dim strSQL As String="select Count(*) from EmployeeInfo where Gender=@Gender and Married=@Married"
cmd.CommandText=strSQL  '指定要执行的SQL语句
Dim para As DbParameter=db.GetInstanceParameter()
para.ParameterName="Gender"
para.Direction=ParameterDirection.Input
para.DbType=DbType.String
para.Value="男"
cmd.Parameters.Add(para)
'设置第二个参数
para=db.GetInstanceParameter()
para.ParameterName="Married"
para.Direction=ParameterDirection.Input
para.DbType=DbType.Boolean
para.Value=True
cmd.Parameters.Add(para)
'设定SQL命令超时时间,这个值的默认时间是30秒,如果一些SQL语句特别耗时的话,
'可以考虑调整此时间,要不然命令还没有执行完就报超时错误而导致命令执行失败。
cmd.CommandTimeout=10 
Dim intCount As Integer
Try
    '执行SQL语句,并返回一个单值
    intCount=cmd.ExecuteScalar()
    Proj.MsgDebug.Add("SQL语句执行返回结果:{0}",intCount)
Catch ex As Exception
    UnhandledExceptionManager.ShowAndSaveLog(ex)
Finally
    '在执行完SQL语句回收ado对象
    cmd.Dispose()
    cn.Close()
    cn.Dispose()
End Try

'示例2:使用专有的数据库类型,每种数据库都要使用相对应的ADO对象类型
'定义一个SQLiteCommand命令
'Dim cmd2 As System.Data.SQLite.SQLiteCommand=db.GetInstanceCommand() '这也是一种使用方法
Dim cmd2 As New System.Data.SQLite.SQLiteCommand()
'定义一个SQLiteConnection连接
Dim cn2 As New System.Data.SQLite.SQLiteConnection(db.ConnectionString)
Proj.MsgDebug.Add("新获得的连接对象字符串:{0}",cn2.ConnectionString)
Proj.MsgDebug.Add("新获得的连接对象状态:{0}",cn2.State.ToString())
cn2.Open()

'初始化命令的参数
cmd2.Connection=cn2 '将创建的数据库连接赋值上
cmd2.CommandType=CommandType.Text '设置命令执行的类型
cmd2.CommandText=strSQL  '指定要执行的SQL语句
Dim para2 As New System.Data.SQLite.SQLiteParameter
para2.ParameterName="Gender"
para2.Direction=ParameterDirection.Input
para2.DbType=DbType.String
para2.Value="男"
cmd2.Parameters.Add(para2)
'设置第二个参数
para2=New System.Data.SQLite.SQLiteParameter
para2.ParameterName="Married"
para2.Direction=ParameterDirection.Input
para2.DbType=DbType.Boolean
para2.Value=True
cmd2.Parameters.Add(para2)
'设定SQL命令超时时间,这个值的默认时间是30秒,如果一些SQL语句特别耗时的话,
'可以考虑调整此时间,要不然命令还没有执行完就报超时错误而导致命令执行失败。
cmd2.CommandTimeout=10 
Try
    '执行SQL语句,并返回一个单值
    intCount=cmd2.ExecuteScalar()
    Proj.MsgDebug.Add("SQL语句执行返回结果:{0}",intCount)
Catch ex As Exception
    UnhandledExceptionManager.ShowAndSaveLog(ex)
Finally
    '在执行完SQL语句回收ado对象   
    cn2.Close()
    cn2.Dispose()
    cmd2.Dispose()
End Try

'上面基本上使用的是最原始的ADO.Net的用法,只有在一些特殊的场景下才会考虑使用
'比如说上面提到的想修改命令执行超时时间
'同样的功能,正常情况下我们想达到相同的效果该如何简化功能呢?只需要两句代码
'示例3:平台内推荐使用的方法
Dim paras=New With {.Gender = "男",.Married=True}
intCount=db.ExecuteScalar(strSQL,CommandType.Text,paras)
Proj.MsgDebug.Add("SQL语句执行返回结果:{0}",intCount)

'返回结果:新获得的连接对象字符串:failifmissing=False;pooling=True;data source=E:\编程相关\Cardan\NativeDemo\Data\UserDB.db
'返回结果:新获得的连接对象状态:Closed
'返回结果:SQL语句执行返回结果:6
'返回结果:新获得的连接对象字符串:failifmissing=False;pooling=True;data source=E:\编程相关\Cardan\NativeDemo\Data\UserDB.db
'返回结果:新获得的连接对象状态:Closed
'返回结果:SQL语句执行返回结果:6
'返回结果:SQL语句执行返回结果:6

C#
// 先获得数据源
Database db = Proj.SysDataFactory["UserDB"];

// 示例1:使用一个通用的写法,此写法的好处是可以针对多种数据源使用相同方法
// 定义一个命令,用DbCommand类型是方便针对所有数据源使用,主要是通用
DbCommand cmd = db.GetInstanceCommand();
// 定义一个连接
DbConnection cn = db.GetInstanceConnection();
Proj.MsgDebug.Add("新获得的连接对象字符串:{0}", cn.ConnectionString);
Proj.MsgDebug.Add("新获得的连接对象状态:{0}", cn.State.ToString());
cn.Open();
// 初始化命令的参数
cmd.Connection = cn; // 将创建的数据库连接赋值上
cmd.CommandType = CommandType.Text; // 设置命令执行的类型
string strSQL = "select Count(*) from EmployeeInfo where Gender=@Gender and Married=@Married";
cmd.CommandText = strSQL;  // 指定要执行的SQL语句
DbParameter para = db.GetInstanceParameter();
para.ParameterName = "Gender";
para.Direction = ParameterDirection.Input;
para.DbType = DbType.String;
para.Value = "男";
cmd.Parameters.Add(para);
// 设置第二个参数
para = db.GetInstanceParameter();
para.ParameterName = "Married";
para.Direction = ParameterDirection.Input;
para.DbType = DbType.Boolean;
para.Value = true;
cmd.Parameters.Add(para);
// 设定SQL命令超时时间,这个值的默认时间是30秒,如果一些SQL语句特别耗时的话,
// 可以考虑调整此时间,要不然命令还没有执行完就报超时错误而导致命令执行失败。
cmd.CommandTimeout = 10;
int intCount;
try
{
    // 执行SQL语句,并返回一个单值
    intCount = cmd.ExecuteScalar().CType<int>(0);
    Proj.MsgDebug.Add("SQL语句执行返回结果:{0}", intCount);
}
catch (Exception ex)
{
    UnhandledExceptionManager.ShowAndSaveLog(ex);
}
finally
{
    // 在执行完SQL语句回收ado对象
    cmd.Dispose();
    cn.Close();
    cn.Dispose();
}

// 示例2:使用专有的数据库类型,每种数据库都要使用相对应的ADO对象类型
// 定义一个SQLiteCommand命令
// Dim cmd2 As System.Data.SQLite.SQLiteCommand=db.GetInstanceCommand() '这也是一种使用方法
System.Data.SQLite.SQLiteCommand cmd2 = new System.Data.SQLite.SQLiteCommand();
// 定义一个SQLiteConnection连接
System.Data.SQLite.SQLiteConnection cn2 = new System.Data.SQLite.SQLiteConnection(db.ConnectionString);
Proj.MsgDebug.Add("新获得的连接对象字符串:{0}", cn2.ConnectionString);
Proj.MsgDebug.Add("新获得的连接对象状态:{0}", cn2.State.ToString());
cn2.Open();

// 初始化命令的参数
cmd2.Connection = cn2; // 将创建的数据库连接赋值上
cmd2.CommandType = CommandType.Text; // 设置命令执行的类型
cmd2.CommandText = strSQL;  // 指定要执行的SQL语句
System.Data.SQLite.SQLiteParameter para2 = new System.Data.SQLite.SQLiteParameter();
para2.ParameterName = "Gender";
para2.Direction = ParameterDirection.Input;
para2.DbType = DbType.String;
para2.Value = "男";
cmd2.Parameters.Add(para2);
// 设置第二个参数
para2 = new System.Data.SQLite.SQLiteParameter();
para2.ParameterName = "Married";
para2.Direction = ParameterDirection.Input;
para2.DbType = DbType.Boolean;
para2.Value = true;
cmd2.Parameters.Add(para2);
// 设定SQL命令超时时间,这个值的默认时间是30秒,如果一些SQL语句特别耗时的话,
// 可以考虑调整此时间,要不然命令还没有执行完就报超时错误而导致命令执行失败。
cmd2.CommandTimeout = 10;
try
{
    // 执行SQL语句,并返回一个单值
    intCount = cmd2.ExecuteScalar().CType<int>(0);
    Proj.MsgDebug.Add("SQL语句执行返回结果:{0}", intCount);
}
catch (Exception ex)
{
    UnhandledExceptionManager.ShowAndSaveLog(ex);
}
finally
{
    // 在执行完SQL语句回收ado对象
    cn2.Close();
    cn2.Dispose();
    cmd2.Dispose();
}

// 上面基本上使用的是最原始的ADO.Net的用法,只有在一些特殊的场景下才会考虑使用
// 比如说上面提到的想修改命令执行超时时间
// 同样的功能,正常情况下我们想达到相同的效果该如何简化功能呢?只需要两句代码
// 示例3:平台内推荐使用的方法
var paras = new { Gender = "男", Married = true };
intCount = db.ExecuteScalar(strSQL, CommandType.Text, paras).CType<int>(0);
Proj.MsgDebug.Add("SQL语句执行返回结果:{0}", intCount);

//返回结果:新获得的连接对象字符串:failifmissing=False;pooling=True;data source=E:\编程相关\Cardan\NativeDemo\Data\UserDB.db
//返回结果:新获得的连接对象状态:Closed
//返回结果:SQL语句执行返回结果:6
//返回结果:新获得的连接对象字符串:failifmissing=False;pooling=True;data source=E:\编程相关\Cardan\NativeDemo\Data\UserDB.db
//返回结果:新获得的连接对象状态:Closed
//返回结果:SQL语句执行返回结果:6
//返回结果:SQL语句执行返回结果:6