C# SQLCommand - 参数化查询被缩短
C# SQLCommand - Parametrized query is cut short
抱歉格式有点粗糙
我在 C# 中通过 SQLCommand 插入语句时遇到问题。插入完成后,ID 将返回给程序。
我填充了一些变量并编写了一个 SQLCommand。所有的参数都考虑到了。
using (SqlCommand sqlCatCmd = new SqlCommand())
{
sqlCatCmd.CommandText =
"INSERT INTO [ChargeType](IsRecurring, IsApplied4NewMembers, Name, PurseID, AllowFamilyDiscount) " +
"Values (@IsRec, @NewMem, @CName, @PurseID, @FamDisc);" +
"SET @ChrgID = SCOPE_IDENTITY();";
//Connections are opened further up the code no need to include
sqlCatCmd.Connection = _importSettings.sqlServerConnection;
sqlCatCmd.Transaction = _importSettings.sqlServerTransaction;
//Parameters
sqlCatCmd.Parameters.AddWithValue("@IsRec", _reapply);
sqlCatCmd.Parameters.AddWithValue("@NewMem", _onNewMem);
sqlCatCmd.Parameters.AddWithValue("@CName", _name);
sqlCatCmd.Parameters.AddWithValue("@PurseID", _purse);
sqlCatCmd.Parameters.AddWithValue("@FamDisc", _applyFamDisc);
//Create parameter for newly added chargeType id value
SqlParameter ChrgTypeIDReturn = new SqlParameter();
ChrgTypeIDReturn.ParameterName = "@ChrgID";
ChrgTypeIDReturn.Size = 4;
ChrgTypeIDReturn.Direction = ParameterDirection.Output;
sqlCatCmd.Parameters.Add(ChrgTypeIDReturn);
//execute
sqlCatCmd.ExecuteNonQuery();
//update variable with returned id value
_chrgTypeReturnedId = Convert.ToInt32(ChrgTypeIDReturn.Value);
_importSettings.sqlServerTransaction.Commit();
conn.CloseSqlConnection(_importSettings.sqlServerConnection);
}
当我执行查询时,捕获到以下内容:
The parameterized query '(@IsRec nvarchar(1),@NewMem nvarchar(1),@CName nvarchar(25),@Pur' expects the parameter '@PurseID', which was not supplied.
它似乎缩短了查询,我在这里缺少限制吗?查看我的字符串,它在语法上似乎是正确的
谢谢
我认为它不会削减查询,因为它在异常消息的后面提到了完整的参数名称 @PurseID
。
检查是否 _purse == null
有机会。如果是这样,您必须改用 DBNull.Value
。
你可以重写SQL语句来输出insert id。
像:
INSERT INTO table1 (name) OUTPUT Inserted.ID VALUES('FooBar')
然后使用 ExecuteScalar() 而不是 ExecuteNonQuery()。
重写:
using (SqlCommand sqlCatCmd = new SqlCommand())
{
sqlCatCmd.CommandText =
"INSERT INTO [ChargeType](IsRecurring, IsApplied4NewMembers, Name, PurseID, AllowFamilyDiscount) " +
"OUTPUT Inserted.ID " +
"Values (@IsRec, @NewMem, @CName, @PurseID, @FamDisc)";
//Connections are opened further up the code no need to include
sqlCatCmd.Connection = _importSettings.sqlServerConnection;
sqlCatCmd.Transaction = _importSettings.sqlServerTransaction;
//Parameters
sqlCatCmd.Parameters.AddWithValue("@IsRec", _reapply);
sqlCatCmd.Parameters.AddWithValue("@NewMem", _onNewMem);
sqlCatCmd.Parameters.AddWithValue("@CName", _name);
sqlCatCmd.Parameters.AddWithValue("@PurseID", _purse);
sqlCatCmd.Parameters.AddWithValue("@FamDisc", _applyFamDisc);
//ExecuteScalar to get OUTPUT value from Sql string
int insertedId = sqlCatCmd.ExecuteScalar() as int;
//update variable with returned id value
_chrgTypeReturnedId = insertedId;
_importSettings.sqlServerTransaction.Commit();
conn.CloseSqlConnection(_importSettings.sqlServerConnection);
}
抱歉格式有点粗糙
我在 C# 中通过 SQLCommand 插入语句时遇到问题。插入完成后,ID 将返回给程序。
我填充了一些变量并编写了一个 SQLCommand。所有的参数都考虑到了。
using (SqlCommand sqlCatCmd = new SqlCommand())
{
sqlCatCmd.CommandText =
"INSERT INTO [ChargeType](IsRecurring, IsApplied4NewMembers, Name, PurseID, AllowFamilyDiscount) " +
"Values (@IsRec, @NewMem, @CName, @PurseID, @FamDisc);" +
"SET @ChrgID = SCOPE_IDENTITY();";
//Connections are opened further up the code no need to include
sqlCatCmd.Connection = _importSettings.sqlServerConnection;
sqlCatCmd.Transaction = _importSettings.sqlServerTransaction;
//Parameters
sqlCatCmd.Parameters.AddWithValue("@IsRec", _reapply);
sqlCatCmd.Parameters.AddWithValue("@NewMem", _onNewMem);
sqlCatCmd.Parameters.AddWithValue("@CName", _name);
sqlCatCmd.Parameters.AddWithValue("@PurseID", _purse);
sqlCatCmd.Parameters.AddWithValue("@FamDisc", _applyFamDisc);
//Create parameter for newly added chargeType id value
SqlParameter ChrgTypeIDReturn = new SqlParameter();
ChrgTypeIDReturn.ParameterName = "@ChrgID";
ChrgTypeIDReturn.Size = 4;
ChrgTypeIDReturn.Direction = ParameterDirection.Output;
sqlCatCmd.Parameters.Add(ChrgTypeIDReturn);
//execute
sqlCatCmd.ExecuteNonQuery();
//update variable with returned id value
_chrgTypeReturnedId = Convert.ToInt32(ChrgTypeIDReturn.Value);
_importSettings.sqlServerTransaction.Commit();
conn.CloseSqlConnection(_importSettings.sqlServerConnection);
}
当我执行查询时,捕获到以下内容:
The parameterized query '(@IsRec nvarchar(1),@NewMem nvarchar(1),@CName nvarchar(25),@Pur' expects the parameter '@PurseID', which was not supplied.
它似乎缩短了查询,我在这里缺少限制吗?查看我的字符串,它在语法上似乎是正确的
谢谢
我认为它不会削减查询,因为它在异常消息的后面提到了完整的参数名称 @PurseID
。
检查是否 _purse == null
有机会。如果是这样,您必须改用 DBNull.Value
。
你可以重写SQL语句来输出insert id。
像:
INSERT INTO table1 (name) OUTPUT Inserted.ID VALUES('FooBar')
然后使用 ExecuteScalar() 而不是 ExecuteNonQuery()。 重写:
using (SqlCommand sqlCatCmd = new SqlCommand())
{
sqlCatCmd.CommandText =
"INSERT INTO [ChargeType](IsRecurring, IsApplied4NewMembers, Name, PurseID, AllowFamilyDiscount) " +
"OUTPUT Inserted.ID " +
"Values (@IsRec, @NewMem, @CName, @PurseID, @FamDisc)";
//Connections are opened further up the code no need to include
sqlCatCmd.Connection = _importSettings.sqlServerConnection;
sqlCatCmd.Transaction = _importSettings.sqlServerTransaction;
//Parameters
sqlCatCmd.Parameters.AddWithValue("@IsRec", _reapply);
sqlCatCmd.Parameters.AddWithValue("@NewMem", _onNewMem);
sqlCatCmd.Parameters.AddWithValue("@CName", _name);
sqlCatCmd.Parameters.AddWithValue("@PurseID", _purse);
sqlCatCmd.Parameters.AddWithValue("@FamDisc", _applyFamDisc);
//ExecuteScalar to get OUTPUT value from Sql string
int insertedId = sqlCatCmd.ExecuteScalar() as int;
//update variable with returned id value
_chrgTypeReturnedId = insertedId;
_importSettings.sqlServerTransaction.Commit();
conn.CloseSqlConnection(_importSettings.sqlServerConnection);
}