将参数传递给SQLCommand的最佳方法是什么?你可以做:
cmd.Parameters.Add("@Name", SqlDbType.VarChar, 20).Value = "Bob";
Run Code Online (Sandbox Code Playgroud)
要么
cmd.Parameters.Add("@Name", SqlDbType.VarChar).Value = "Bob";
Run Code Online (Sandbox Code Playgroud)
要么
cmd.Parameters.Add("@Name").Value = "Bob";
Run Code Online (Sandbox Code Playgroud)
看起来第一个可能在某种程度上"更好",无论是性能方面还是错误检查方式.但我想更清楚地知道.
我有以下代码使用存储过程拉回DataTable并输入字符串参数@JobNumbers,这是动态创建的作业编号字符串(因此长度未知):
using (SqlConnection connection = new SqlConnection(con))
{
SqlCommand cmd = new SqlCommand("dbo.Mystoredprocedure", connection);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@JobNumbers", SqlDbType.VarChar, 4000);
cmd.Parameters["@JobNumbers"].Value = JobNumber;
SqlDataAdapter da = new SqlDataAdapter(cmd);
connection.Open();
da.Fill(JobDetails);
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我当前将JobNumber参数设置为4000的长度,这应该足以承担大约500个作业号并且应该足够了.但是,有可能在奇怪的场合需要更多.所以,我想知道,有没有办法将参数设置为nvarchar(max)的等效sql参数类型?
我已经看过各种类似的问题(将参数传递给SQLCommand的最佳方法是什么?)但没有具体说明你是否可以(或不能)这样做.其次,如果我将存储过程中的@JobNumber参数设置为nvarchar(max),甚至需要这样做,因此我可能根本不需要在C#中设置长度?如果我这样做,这将有潜在的性能问题,如此问题中所建议的在添加SqlCommand参数时何时应该使用"SqlDbType"和"size"??
这个问题是这个问题的一个更具体的版本:
但我注意到其他数据类型的性能相同(事实上,在我的情况下,我根本没有使用任何bigint类型).
以下是一些其他问题似乎应该涵盖这个问题的答案,但我观察的是他们所指出的相反的问题:
我有一些C#代码用于将数据插入表中.代码本身是数据驱动的,因为一些其他数据指定了应该插入数据的目标表.所以,我可以在存储过程中使用动态SQL,我选择在我的C#应用程序中生成动态SQL.
对于第I行插入,命令文本始终相同,因此在插入任何行之前,我会生成一次.命令文本的格式如下:
INSERT SomeSchema.TargetTable ( Column1, Column2, Column3, ... )
VALUES ( SomeConstant, @p0, @p1, ... );
Run Code Online (Sandbox Code Playgroud)
对于每个插入,我创建一个SqlParameter对象数组.
对于' nvarchar'行为,我只是使用SqlParameter(string parameterName, object value)构造函数方法,而不是显式设置任何其他属性.
对于"简并的行为,我所用的SqlParameter(string parameterName, SqlDbType dbType)构造方法,并且还设定Size,Precision和Scale特性适当.
对于这两个版本的代码,传递给构造函数方法或单独分配给Value属性的值的类型为object.
' nvarchar'版本的代码大约需要1-1.5分钟."退化"或"特定类型"代码需要超过9分钟; 所以慢了6-9倍.
SQL Server Profiler没有透露任何明显的罪魁祸首.特定于类型的代码生成看起来更好的SQL,即动态SQL命令,其参数包含适当的数据类型和类型信息.
我怀疑,因为我传递了一个object类型值作为参数值,ADO.NET …
我的数据库中有一个表,其中2列的uniqueidentifier不是null类型。我正在尝试从asp.net c#在该表上插入一行,如下所示:
sqlCmd.CommandText = string.Format("Insert Into Member(MemberNo,MemberEmpId,...) values({0},{1},... )", MemNo, MemEmpNo, ...);
Run Code Online (Sandbox Code Playgroud)
它引发了以下异常,
“浮点值'24e46222'超出计算机表示范围(8个字节)。'a8c'附近的语法不正确。浮点值'6664e7925'超出计算机表示范围(8字节)。”
我用谷歌搜索了这个错误,并得到了参考,我尝试了一下,但是仍然给出了同样的错误。有人可以帮我解决这个问题。除了这个,我什么也找不到。
提前致谢!
我收到此错误:“输入字符串的格式不正确。”
这是我的代码:
private void UpdatePOdetailBalance(int Qty)
{
int newbal;
SqlCommand com = new SqlCommand();
com.Connection = cn;
newbal = Convert.ToInt16(txtQtyOrdered.Text) - Qty;
com.CommandText =
"UPDATE PODetail SET BalanceQty="+ newbal +" WHERE OrderID=" +
Convert.ToInt16(txtPONumber.Text) + "AND ItemID=" +
Convert.ToInt16(txtItemNo.Text);
com.ExecuteNonQuery();
}
private void btnOK_Click(object sender, EventArgs e)
{
UpdatePOdetailBalance(Convert.ToInt16(txtQuantity.Text));
}
Run Code Online (Sandbox Code Playgroud)
我想计算等于txtQtyOrdered减去数量的newbal,但我收到此错误,请为此提供帮助。谢谢。
c# ×5
sql ×2
sql-server ×2
sqlcommand ×2
sqlparameter ×2
.net ×1
ado.net ×1
asp.net ×1
format ×1
nvarchar ×1
sqldbtype ×1