7813/12404=62.99%程序中拼sql语句执行/存储过程执行12404/7813=158.76%

using System; 
using System.Data; 
using System.Configuration; 
using System.Web; 
using System.Data.OleDb; 
namespace acc_select 

 /// <summary> 
 /// accselect 的摘要说明 
 /// </summary> 
 public class accselect 
 { 
 //”Provider=Microsoft.Jet.OLEDB.4.0; Data Source=d:\dq\db1.mdb” 
 private string conn = ConfigurationManager.ConnectionStrings[“tsingConnectionString”].ToString(); 
 public string sql = string.Empty; 
 public int t = 4; 
 public object v = null; 
 public accselect() 
 { 
 } 
 /// <summary> 
 /// 构造函数,传递ACC参数查询语句 
 /// </summary> 
 /// <param name=”strsql”>strsql字符型</param> 
 public accselect(string strsql) 
 { 
 sql = strsql; 
 } 
 /// <summary> 
 /// 构造函数,传递ACC参数查询语句 
 /// </summary> 
 /// <param name=”strsql”>参数查询语句</param> 
 /// <param name=”total”>字节数</param> 
 public accselect(string strsql, int total) 
 { 
 sql = strsql; 
 t = total; 
 } 
 /// <summary> 
 /// 构造函数 
 /// </summary> 
 /// <param name=”strsql”>参数查询语句</param> 
 /// <param name=”total”>字节数</param> 
 /// <param name=”value”>OBJECT值</param> 
 public accselect(string strsql, int total, object value) 
 { 
 sql = strsql; 
 t = total; 
 v = value; 
 } 
 /// <summary> 
 /// getOdd方法返回OleDbDataReader 
 /// </summary> 
 /// <param name=”odt”>定义OleDbType类型</param> 
 /// <returns></returns> 
 public OleDbDataReader getOdd(OleDbType odt) 
 { 
 OleDbConnection conns = new OleDbConnection(this.conn); 
 OleDbCommand cmd = new OleDbCommand(this.sql, conns); 
 OleDbParameter parm = new OleDbParameter(“temp”, odt, this.t); 
 parm.Direction = ParameterDirection.Input; 
 cmd.Parameters.Add(parm); 
 cmd.Parameters[0].Value = this.v; 
 conns.Open(); 
 OleDbDataReader oda = cmd.ExecuteReader(); 
 cmd.Dispose(); 
 return oda; 
 } 
 string Sql 
 { 
 get 
 { 
 return sql; 
 } 
 set 
 { 
 sql = value; 
 } 
 } 
 int T 
 { 
 get 
 { 
 return t; 
 } 
 set 
 { 
 t = value; 
 } 
 } 
 object V 
 { 
 get 
 { 
 return v; 
 } 
 set 
 { 
 v = value; 
 } 
 } 
 } 

//调用方法 
//accselect acc = new accselect(); 
//acc.sql = “select * from dtt where d_id=?”; 
//acc.t = 10; 
//acc.v = 1; 
//OleDbDataReader oda = acc.getOdd(OleDbType.VarChar); 
//Repeater1.DataSource = oda; 
//Repeater1.DataBind(); 

经过不完全测试:
测试代码:
using System;
using System.Collections;
using System.IO;

2)使用存储过程来插入数据,代码如下:

 connString=”Provider=Microsoft.Jet.OLEDB.4.0; Data Source=” & Server.MapPath(“db1.mdb”) 
 set conn = Server.CreateObject(“Adodb.Connection”) 
 conn.ConnectionString = connString 
 conn.open() 
 set mycmd = Server.CreateObject(“ADODB.Command”) 
 mycmd.ActiveConnection=conn 
 mycmd.CommandText=sql 
 mycmd.Prepared = true 
 set mypar = mycmd.CreateParameter(“temp”,adotype,adodct,strlong,values) 
 mycmd.Parameters.Append mypar 
 set myrs = mycmd.Execute 
 set acc_sql=myrs  
end function  
‘调用方法 
‘dim rs 
‘sql=”select * from users where id=? order by id” 
‘set rs=acc_sql(sql,3,1,4,1) 
‘if not rs.eof then 
 ‘response.Write(rs(1)) 
‘end if 

MyPDO.DataAccess.DataAccessor DBA = new DataAccessor();
DBA.ConnectString = “Provider=SQLOLEDB;data source=10.10.25.63;initial
catalog=Master;user id=zha;Password=123;”;
DBA.Open();
if (DBA.IsOpen == true)
{
DBA.CommandText = “select * from myfiles where path = ? and fname =
?”;
DBA.SetCommandParameter(parms,false);
DBA.SetCommandParameter(parms1,false);
System.Data.DataSet ds = DBA.GetDataSet();
Assert.AreEqual(1,ds.Tables[0].Rows.Count);
DBA.Close();
}
}
[Test]
public void AllUseTest()
{
this.ExecuteCommandTest();
this.ExecuteNonQueryTest();
this.GetDataReaderTest();
this.GetDataReaderTestWithParamBlob();
this.GetDataReaderTestWithParamString();
this.GetDataSetTest();
this.GetDataTableTest();
this.SetCommandParametersTest();
}
[Test]
public void GetDataReaderTestWithParamString()
{
System.Data.OleDb.OleDbParameter parms = new
System.Data.OleDb.OleDbParameter();
parms.ParameterName = “@path”;
//parms.OleDbType = System.Data.OleDb.OleDbType.VarChar;
//parms.Size = 255;
//parms.SourceColumn = “path”;
parms.Value = “eeee”;

1)在程序代码中拼sql语句,类似代码如下:

Set parameter = command.CreateParameter (Name, Type, Direction, Size, Value)
参数同上
以下是实例,查询news表中所有tsing发表的新闻
 —————————————————— 
 

if (DBA.IsOpen == true)
{
DBA.CommandText = “exec get_2 ‘222’”;
object j =
DBA.ExecuteStoredProcedure(MyPDO.StoredProcedureType.OneValue);
string s = (string)j;
Assert.AreEqual(“222”,s);
}
}
[Test]
public void ExecuteStoredProcedureTestNone()
{
if (DBA.IsOpen == true)
{
DBA.CommandText = “exec get_2 ‘222’”;
object s = DBA.ExecuteStoredProcedure(MyPDO.StoredProcedureType.None);
Assert.AreEqual(null,s);
}
else
Assert.AreEqual(null,”1″);
}
[Test]
public void ExecuteStoredProcedureTestDataSet()
{
if (DBA.IsOpen == true)
{
DBA.CommandText = “exec get_2 ‘ddddd'”;
object s =
DBA.ExecuteStoredProcedure(MyPDO.StoredProcedureType.DataSet);

最后得出结论,存储过程的执行效率要比在程序中拼sql语句的执行效率要高。不过如果总的执行时间很长,如10分钟或是20分钟,这样节省的时间对用户来说可能没什么太大的感觉,例如由原来的20分钟,缩短到12-13分钟,如果不卡表比照,没什么感觉的。只有当原来是2个小时的导入时间,现在只要1个小时多一点,这时才会有明显的感觉。至于最后使用哪种方式,自己选择,如果导入时间在20分钟以内,如果不要求性能与效率,哪种方式都差不多。

与上面基本相同不同的地方法是asp在对参数的表达上面不同
129为adChar,1就是指示输入参数(是其实是默认值)
大家请参阅MICROSOFT的ADOVB.Inc:

作者Blog:

代码如下复制代码

 sql=”select * from newss where username=? order by id” 
 //注意查询的条件均用?号表示 
 OleDbConnection conn = new OleDbConnection(connString); 
 OleDbCommand cmd = new OleDbCommand(sql,conn);  
 OleDbParameter parm = new OleDbParameter(“temp”,OleDbType.VarChar, 50); 
 //temp为Parameter对象可随便定义,OleDbType.VarChar指定为字符串,长度50 
 parm.Direction = ParameterDirection.Input; 
 //指定其类型输入参数 
 cmd.Parameters.Add(parm); 
 cmd.Parameters[“temp”].Value = “tsing”; 
 //查询tsing,也可以写成cmd.Parameters[0] 
 conn.Open(); 
 cmd.ExecuteReader(); 

br.Close();
fs.Close();

sql =insert into
EMS_EDI_WO_IMG(WO_NO,COMP_NO,Take_Date,PROCESS_NO,Item_No,Take_Type,Qty,Unit,EMS_NO,PCNO)

复制代码 代码如下:

//System.Data.OleDb.OleDbParameter parms2 = new
System.Data.OleDb.OleDbParameter()

System.Data.OleDb.OleDbCommand Command=conn.CreateCommand();
Command.CommandTimeout=0; Command.Transaction=trans;
Command.CommandType=CommandType.Text; string sql=; for(int
i=0;iIWo_Img.Count;i++) { Wo_Img=IWo_Img[i] as EMS_EDI_WO_IMG;
Wo_ImgDb.Wo_No=Wo_Img.Wo_No; Wo_ImgDb.Comp_No=Wo_Img.Comp_No;
Wo_ImgDb.Take_Date_=Wo_Img.Take_Date; Wo_ImgDb.Ems_No= ems_no;
Wo_ImgDb.Process_No=Wo_Img.Process_No;
Wo_ImgDb.Item_No_欧博国际平台,=Wo_Img.Item_No;
Wo_ImgDb.Take_Type_=Wo_Img.Take_Type;
Wo_ImgDb.Qty_=Wo_Img.Qty.ToString(); Wo_ImgDb.Unit_=Wo_Img.Unit;
Wo_ImgDb.Pcno=pcsum;

复制代码 代码如下:

[SetUp]
public void SetUp()
{
DBA = new DataAccessor();
DBA.ConnectString = “Provider=SQLOLEDB;data source=10.10.25.63;initial
catalog=Master;user id=zha;Password=123;”;
DBA.ConnectType = MyPDO.ConnectType.OleDbDataDriver;
DBA.Open();
Assert.IsTrue(DBA.IsOpen,”DBA closed”);
}
[Test]
public void ExecuteNonQueryTest()
{
Hashtable hsTable = new Hashtable();
hsTable.Add(“A”,”select * from myfiles”);
DBA.
Assert.IsTrue(DBA.IsOpen,”DBA closed”);
if (DBA.IsOpen == true)
{
DBA.ExecuteNonQuery(hsTable);
}
}
[Test]
public void GetDataSetTest()
{
System.Data.DataSet ds = new System.Data.DataSet();
Assert.IsTrue(DBA.IsOpen,”DBA closed”);
if (DBA.IsOpen == true)
{
DBA.CommandText = “select * from myfiles”;
ds = DBA.GetDataSet();
}
}
[Test]
public void GetDataTableTest()
{
Assert.IsTrue(DBA.IsOpen,”DBA closed”);
if (DBA.IsOpen == true)
{
DBA.CommandText = “select * from myfiles”;
System.Data.DataTable dts = DBA.GetDataTable();
}
}
[Test]
public void GetDataReaderTest()
{
Assert.IsTrue(DBA.IsOpen,”DBA closed”);
if (DBA.IsOpen == true)
{
DBA.CommandText = “select * from myfiles”;
System.Data.IDataReader dtReader = DBA.GetDataReader();
dtReader.Close();
}
}
[Test]
public void ExecuteCommandTest()
{
Assert.IsTrue(DBA.IsOpen,”DBA closed”);
if (DBA.IsOpen == true)
{
DBA.CommandText = “select * from myfiles”;
DBA.ExecuteCommand(false);
}
}
[Test]
public void SetCommandParametersTest()
{
System.Data.OleDb.OleDbParameter parms = new
System.Data.OleDb.OleDbParameter();
parms.ParameterName = “@path”;
parms.OleDbType = System.Data.OleDb.OleDbType.VarChar;
parms.Size = 255;
parms.SourceColumn = “path”;
parms.Value = “222”;

执行5次,每次执行时都重启一下数据库,每次导入8000条数据,执行时间为:第一次:费时0分1秒531毫秒第二次:费时0分1秒656毫秒第三次:费时0分1秒533毫秒第四次:费时0分1秒542毫秒第五次:费时0分1秒551毫秒

ASP.NET 用OleDbCommand的new OleDbParameter创建参数货查询
ASP用Command的CreateParameter 方法创建参数化查询
(SQL储存过程查询也是用这个方法建立的)

System.Data.DataSet ds = (System.Data.DataSet)s;

Author

发表评论

电子邮件地址不会被公开。 必填项已用*标注