如果我有一个DbCommand定义执行类似的东西:
SELECT Column1 FROM Table1
Run Code Online (Sandbox Code Playgroud)
生成List<String>返回记录的最佳方法是什么?
没有Linq等,因为我正在使用VS2005.
我知道这不是一个有用的问题的地狱,但我不禁被它所困扰.
那么,
为什么所说的方法(在*Command类中)被称为
ExecuteNonQuery而不是ExecuteQuery?
这些SQL语句不是我们在DBs,查询中抛出的吗?
DbParameter param = comm.CreateParameter();
param = comm.CreateParameter();
param.ParameterName = "@StaffId";
if (!string.IsNullOrEmpty(activity.StaffId))
param.Value = activity.StaffId;
param.DbType = DbType.String;
comm.Parameters.Add(param);
Run Code Online (Sandbox Code Playgroud)
以上不起作用(显然),对象未实例化.我正在尝试在未填充StaffId时将NULL插入数据库.我怎样才能做到这一点?
如何将DbCommand参数复制到另一个DbCommand,我想要一个DbCommand与我的上一个参数相同的新参数DbCommand.但现在使用不同的sql字符串.
我定期使用Odbc连接字符串调用DB2数据库时收到此错误消息.我已经尝试将DbCommand对象的CommandTimeout设置为多个值,但我仍然收到以下错误.
SQL0666 - SQL查询超出指定的时间限制或存储限制.
是否有一个技巧来阻止错误输出.这很奇怪,因为相同的查询有时会起作用,有时会超时.任何帮助,将不胜感激.谢谢!
我使用System.Data.Common.DbCommand将新行插入数据库.关键是,这一行已经存在.
try
{
[...]
DbCommand insertCommand = [...]
insertCommand.ExecuteScalar();
[...]
}
catch (System.Exception exception)
{
[...]
throw;
}
Run Code Online (Sandbox Code Playgroud)
如果我将显式捕获System.Data.SqlClient.SqlException,我可以像下面一样评估ErrorNumber.
try
{
//insertion code
}
catch(SqlException ex)
{
if(ex.Number == 2627)
{
//Violation of primary key. Handle Exception
}
}
Run Code Online (Sandbox Code Playgroud)
SqlException上下文中的ErrorNumber 2627意味着违反唯一键.请参阅https://msdn.microsoft.com/en-us/library/ms151757%28v=sql.110%29.aspx
到现在为止还挺好.因为我正在使用DbCommand,因此使用不同类型的关系数据库管理系统,我正在寻找一种更通用的方式来捕获这种违反唯一键约束的行为.
感谢帮助.
我正在使用通用IDbCommand函数(在非SqlCommand帮助器方法中)将SqlCommand.DbType设置为DbType.Date,类似于以下内容:
var param = command.CreateParameter();
param.DbType = DbType.Date;
param.ParameterName = field;
param.Value = ToDb(val);
command.Parameters.Add(param);
Run Code Online (Sandbox Code Playgroud)
并将生成的param.DbType覆盖为DbType.DateTime。(我故意想要SqlDbType.Date,因为列/索引是Sql Server类型的Date,而不是DateTime。)果然,当我反编译时,我看到SqlParameter.DbType设置调用了MetaType.GetMetaTypeFromDbType,它具有以下功能:
internal static MetaType GetMetaTypeFromDbType(DbType target)
{
switch (target)
{
...
case DbType.Date:
case DbType.DateTime:
return MetaType.MetaDateTime;
}
}
Run Code Online (Sandbox Code Playgroud)
因此,强制转换是有意的,相反,我必须做一些骇人听闻的事情,例如:
var param = command.CreateParameter();
var sqlParam = param as SqlParameter;
if (sqlParam != null)
{
sqlParam.SqlDbType = SqlDbType.Date;
}
else
{
param.DbType = DbType.Date;
}
param.ParameterName = field;
param.Value = ToDb(val);
command.Parameters.Add(param);
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么要强制转换?这是从早期版本的Sql Server / framework继承而来的,在早期版本中也许不存在Date,并且可以合理地假设人们不知道DbType.Date和DbType.DateTime之间的区别?还是发生了一些更根本的事情?
没有没有特殊大小写SqlParameter的实际解决方法?
(今天早上搜索时,我发现很少有参考文献,所以也许在另一轮咖啡因之前我只是缺少了一些明显的东西?总是感谢!)
我正在调试一个数据库操作代码,我发现虽然代码永远不会失败,但从未发生过正确的UPDATE.这是代码:
condb.Open();
OleDbCommand dbcom = new OleDbCommand("UPDATE Word SET word=?,sentence=?,mp3=? WHERE id=? AND exercise_id=?", condb);
dbcom.Parameters.AddWithValue("id", wd.ID);
dbcom.Parameters.AddWithValue("exercise_id", wd.ExID);
dbcom.Parameters.AddWithValue("word", wd.Name);
dbcom.Parameters.AddWithValue("sentence", wd.Sentence);
dbcom.Parameters.AddWithValue("mp3", wd.Mp3);
Run Code Online (Sandbox Code Playgroud)
但经过一些调整后,这个工作:
condb.Open();
OleDbCommand dbcom = new OleDbCommand("UPDATE Word SET word=?,sentence=?,mp3=? WHERE id=? AND exercise_id=?", condb);
dbcom.Parameters.AddWithValue("word", wd.Name);
dbcom.Parameters.AddWithValue("sentence", wd.Sentence);
dbcom.Parameters.AddWithValue("mp3", wd.Mp3);
dbcom.Parameters.AddWithValue("id", wd.ID);
dbcom.Parameters.AddWithValue("exercise_id", wd.ExID);
Run Code Online (Sandbox Code Playgroud)
为什么在OleDb连接的情况下必须在WHERE子句中给出最后一个参数是如此重要?之前使用过MySQL,我可以(并且通常会)首先编写WHERE子句的参数,因为这对我来说更合乎逻辑.
一般查询数据库时参数顺序是否重要?一些性能问题还是什么?
是否有其他数据库(如DB2,Sqlite等)需要维护的特定顺序?
更新:我删除?并包括有和没有的专有名称@.订单非常重要.在这两种情况下,只有在最后提到WHERE子句参数时才会发生实际更新.更糟糕的是,在复杂的查询中,很难知道自己哪个订单是Access期望的,并且在订单被更改的所有情况下,查询都没有完成预期的任务而没有警告/错误!
我有一个可以为空的DateTime变量.我想把它写到SQL DB.当我尝试插入时:
如果变量有值,则没有问题.
但如果它没有值,则插入中断错误.
我想问:我们如何通过DbCommand参数将可空的DateTime插入Sql?
(PS:Sql列也可以为空.)
DateTime? myDate = null;
DbCommand dbCommand = new DbCommand();
dbCommand.Parameters.Add("NullableSqlDateField", DbType.DateTime, myDate);
Run Code Online (Sandbox Code Playgroud) 我用的 DbCommand是: System.ComponentModel.Component
我正在用params构建一个对象:
DbCommand command = _webERPDB.GetStoredProcCommand("mySp");
_webERPDB.AddInParameter(command, "@a", DbType.Int32, policyId);
_webERPDB.AddInParameter(command, "@b", DbType.Int32, appPolicyPrintQaCheckListId);
_webERPDB.AddInParameter(command, "@c", DbType.Int32, createdBy);
Run Code Online (Sandbox Code Playgroud)
现在,我想使用linq迭代它:
IEnumerable<DbParameter> t = from a in command.Parameters select a;
Run Code Online (Sandbox Code Playgroud)
但它产生以下错误:

I have error when I try to pass parameter to stored procedure using DbCommand
Error returned:
Procedure or function 'Procedure_Name' expects parameter '@TEID', which was not supplied.
These are my procedure parameters:
@PageNumber INT = 1,
@PageSize INT = 50,
@StartTime nvarchar(max) = -1 ,
@EndTime nvarchar(max) = -1 ,
@Month NVARCHAR(2) = -1,
@Year NVARCHAR(4) = -1,
@Day NVARCHAR(2) = -1,
@Hour NVARCHAR(2)=-1,
@TEID nvarchar(max) ,
@IgnoreIdlingTime int=120,
@DrivingTime int=300,--5 minutes by default
@CalculationFactor nvarchar(10)='speed'
Run Code Online (Sandbox Code Playgroud)
My code to execute …
dbcommand ×11
c# ×10
.net ×3
sql-server ×3
oledbcommand ×2
sql ×2
sqlcommand ×2
database ×1
datetime ×1
db2 ×1
exception ×1
linq ×1
list ×1
ms-access ×1
nullable ×1
odbc ×1
sqlexception ×1
ssis ×1