日期:2014-05-19  浏览次数:20776 次

C#执行带参数sql问题
System.Collections.Hashtable   paramsHashTable   =   new   System.Collections.Hashtable();
paramsHashTable.add( "AA ",DataTime.Now);
  OleDbCommand   command   =   this.getCommand(procedureName,   this.connection);
                                command.CommandType   =   CommandType.StoredProcedure;
                                IDictionaryEnumerator   enumerator   =   paramsHashTable.GetEnumerator();
                                while   (enumerator.MoveNext())   {
                                        OleDbParameter   parameter   =   new   OleDbParameter(enumerator.Key.ToString(),   enumerator.Value);
                                        command.Parameters.Add(parameter);
                                }
为什么上面那样写不行?

------解决方案--------------------
paramsHashTable.add( "AA ",DataTime.Now); //如果现在是2007-07-18 12:56:00,那么执行此代码后AA的值是2007-07-18 12:56:00

OleDbParameter parameter = new OleDbParameter(enumerator.Key.ToString(), enumerator.Value); 
/*然后,这里就变成了new OleDbParameter("AA", "2007-07-18 12:56:00"); 这里2007-07-18 12:56:00是值,又不是参数的类型.当然是错的了.
 申明参数的语法的正确形式之一是:OleDbParameter parameter = new OleDbParameter(名称,类型);
*/

------解决方案--------------------
OleDbCommand 里的参数,可能不能像SqlCommand一样可以使用命名参数,而一般来说是占位符,也就是说要和Sql语句里的参数位置保持一致而不是名称保持一致。
------解决方案--------------------
while (enumerator.MoveNext()) {
OleDbParameter parameter = new OleDbParameter(enumerator.Key.ToString(), enumerator.Value);
command.Parameters.Add(parameter);

==========

哪有这样建参数的?

这样建每个参数默认都是字符型了,长度都有一样,

一个一个的来

// ...
command.Parameters.Add( "AA ", OleDbType.VarChar, 100).Value = ...;
command.Parameters.Add( "BB ", OleDbType.VarChar, 200).Value = ...;
command.Parameters.Add( "CC ", OleDbType.DateTime).Value = ...;
// ...

------解决方案--------------------
日期格式的字符串在数据库中好象可以默认转换成日期类型