很多地方莫名其妙地出错,可能是因为自己用习惯了SQLCOMMAND,改成用Access数据库就不习惯了。
OleDbCommand Cmmand = new OleDbCommand();
Cmmand.CommandText = "UPDATE " + TABLENAME + " SET [number]=@number,"
+"SaleState=@SaleState,"
+"SaleTime=@SaleTime,"
+"MachineCode=@MachineCode,"
+"LicenceCode=@LicenceCode "
+"WHERE [number]=@number";
Cmmand.Parameters.Add("@number", OleDbType.VarChar, 20).Value=info.number;
Cmmand.Parameters.Add("@SaleState", OleDbType.Boolean).Value = info.SaleState;
Cmmand.Parameters.Add("@MachineCode", OleDbType.BigInt).Value = info.MachineCode;
Cmmand.Parameters.Add("@SaleTime", OleDbType.VarChar,20).Value = info.SaleTime.ToString();
Cmmand.Parameters.Add("@LicenceCode", OleDbType.VarChar, 10).Value = info.LicenceCode;
return this.DbHelper.ExecuteNonQuery(Cmmand);
请看上面这段代码,上面的参数并不是顺序对应的,看清楚了没,@SaleTime和@MachineCode出现顺序发生了错位,
结果,以上这段代码放在任何地方都会抛出个OledbException出来.说“数据类型不正确这类的”,因为@SaleTime是datetime类型,@MachineCode是bigint类型,当然会抛出异常啊
在OleDbCommand 和OdbcCommand中使用参数
在OleDbCommand或者OdbcCommand中使用参数时,参数添加到Parameters集合中的顺序必须和存储过程中参数定义的顺序匹配。OLE DB和ODBC的.NET Framework数据供应程序将存储过程的参数视为占位符,按照顺序来给参数赋值。另外,返回参数必须是第一个被加入到Parameters集合中的参数。
OLE DB和ODBC的.NET Framework数据供应程序不提供使用命名参数来向SQL语句或存储过程传递参数。青年人网提示必须使用问号(?)占位符,就像下面一样:
SELECT * FROM Customers WHERE CustomerID = ?
因此,向 Parameters 集合添加 Parameter 对象的顺序必须直接对应于该参数的问号占位符的位置。
导出参数信息
参数也可以使用 CommandBuilder 类从存储过程导出。SqlCommandBuilder 和 OleDbCommandBuilder 类都提供了静态方法 DeriveParameters,该静态方法将自动使用存储过程中的参数信息填充 Command 对象的 Parameters 集合。请注意,DeriveParameters 将改写 Command 的任何现有参数信息。
导出参数信息时需要经历一个到数据源的附加行程,以获取参数信息。如果参数信息在设计时是已知的,则可以通过显式设置参数来提高应用程序的性能。
责任编辑:小草