我有一些与我的SQL服务器交互的类似函数(选择,调用存储过程等),除了下面的例外,它们都可以工作。每个SqlConnection
都包含在一个使用块中,SqlCommand
也包含在一个使用块中。
尝试添加@LastUpdated
参数时,此代码失败。我已经尝试了一些我在其他帖子中看到的建议:cmd.Parameters.Clear()
,包装使用等,但没有运气。当重复尝试设置找到相同参数时,解决了一些具有相同错误的帖子。有可能我错过了,但我看了几个小时,甚至清理了眼镜。任何方向都会受到赞赏。
private void _AddCartItem(bool hasEventInCart, _EventCart cartContents, ref int cartItemId)
{
using (SqlConnection sqlConnection = new SqlConnection(_striMISConnection))
{
sqlConnection.Open();
using (SqlCommand cmd = sqlConnection.CreateCommand())
{
SqlParameter param = new SqlParameter();
cmd.Parameters.Clear();
// add/update CartItem
if (hasEventInCart)
{
// Update item
cmd.CommandText = "SProc2Insert @CartItemId, @ID, 'Event', @Created, @LastUpdated";
param.ParameterName = "@CartItemId";
param.Value = cartItemId;
cmd.Parameters.Add(param);
}
else
{
// add item
cmd.CommandText = "SProc2Update @ID, 'Event', @Created, @LastUpdated";
}
cmd.CommandType = CommandType.Text;
param.ParameterName = "@Created";
param.Value = DateTime.Now.ToString();
cmd.Parameters.Add(param);
param.ParameterName = "@LastUpdated";
param.Value = DateTime.Now.ToString();
**cmd.Parameters.Add(param);**
param.ParameterName = "@ID";
param.Value = this.ID;
cmd.Parameters.Add(param);
if (hasEventInCart)
{
cmd.ExecuteNonQuery(); // do the update
}
else
{
cartItemId = (int)cmd.ExecuteScalar();
foreach (var currentCartEvent in cartContents.CartEvents)
{
if (currentCartEvent.EventCode == this.EventCode)
{
currentCartEvent.CartItemID = cartItemId;
}
}
}
cmd.Parameters.Clear();
}
}
}
答案 0 :(得分:1)
首先,如果您要调用存储过程,则需要将CommandType
设置为CommandType.StoredProcedure
- 而不是Text
:
cmd.CommandType = CommandType.StoredProcedure;
并只使用存储过程名称作为命令查询:
cmd.CommandText = "dbo.SProc2Update";
其次,我不会只使用一个SqlParameter
个实例并不断添加一遍 - 我会直接使用.Add()
方法 - 并且停止转换< / strong>所有日期/时间到字符串!使用他们拥有的相应的原生数据类型 - DateTime
- 并在Parameters.Add()
电话中指定:
cmd.Parameters.Add("@Created", SqlDbType.DateTime).Value = DateTime.Now;
cmd.Parameters.Add("@LastUpdated", SqlDbType.DateTime).Value = DateTime.Now;
答案 1 :(得分:1)
我遇到了同样的问题,你可以使用下面的代码解决它:
if (SqlParams != null && SqlParams.Count > 0)
{
foreach (SqlParameter spp in SqlParams )
{
SqlParameter nameParam = new SqlParameter(spp.ParameterName, spp.SqlValue);
mycmd.Parameters.Add(nameParam);
}
}
答案 2 :(得分:0)
这就是我的工作方式:
ILease lease = (ILease)_SqlParameterCollection.InitializeLifetimeService();
if (lease.CurrentState == LeaseState.Initial)
{
lease.InitialLeaseTime = TimeSpan.FromMinutes(5);
lease.SponsorshipTimeout = TimeSpan.FromMinutes(2);
lease.RenewOnCallTime = TimeSpan.FromMinutes(2);
lease.Renew(new TimeSpan(0, 5, 0));