SQL Server是2014。VisualStudio 2017。
我试图将3个参数传递给SQL Server,但出现此错误:
System.Data.SqlClient.SqlException:“必须声明标量变量“ @ Title1Item”。“
我同时包含了C#和SQL Server端代码。谁能告诉我我在做什么错?
'body' => [
"query" => [
"bool" => [
"should" => [
["regexp" => [
"tags" => [
"value" => ".{2,8}" . $query . ".*",
]
],
],
["wildcard" => [
"tags" => [
"value" => "*" . $query . "*",
"boost" => 1.0,
"rewrite" => "constant_score"
]
]
]
]],
], "highlight" => [
"fields" => [
"tags" => ["type" => "plain"]
]
]
]
我希望将3个参数传递给存储过程,但在da.fill(myRecords)行上却收到此错误:
System.Data.SqlClient.SqlException:“必须声明标量变量“ @ Title1Item”。“
编辑:对不起,伙计们。生锈的老程序员在这里。存储过程代码:
public DataTable GetInventoryByAssetDescription (string Desc, string DispositionText, bool Title1Item) {
DataTable myRecords = new DataTable();
using (SqlConnection cn = new SqlConnection (ConnectionString)) {
// Specify which stored procedure to use and add a parameter.
SqlCommand cmd = new SqlCommand ("GetInventoryByAssetDescription", cn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue ("@SearchString", Desc);
cmd.Parameters.AddWithValue ("@DispositionText", DispositionText);
cmd.Parameters.AddWithValue ("@Title1Item", Title1Item);
SqlDataAdapter da = new SqlDataAdapter (cmd);
cn.Open();
da.Fill (myRecords);
}
ALTER PROCEDURE [dbo].[GetInventoryByAssetDescription] (
@SearchString varchar(30),
@DispositionText varchar(200),
@Title1Item bit
)
答案 0 :(得分:0)
在SQLServer中将数据类型BIT用作SP参数时,必须从C#发送值1或0(不是true或false),因此必须将bool转换为int(1表示true,0表示false)
例如
cmd.Parameters.AddWithValue ("@Title1Item", Title1Item ? 1 : 0);
或
cmd.Parameters.AddWithValue ("@Title1Item", (int)Title1Item);
答案 1 :(得分:0)
正确;问题是您的SP,而不是C#代码。它无法以书面形式运行。参数和局部变量不是“环境”的-它们不会在EXEC
或EXECUTE
块内定义,因为它们的作用域不在此范围内。在某些情况下,sp_executesql
允许您通过声明参数/值并将其添加为附加参数来传递参数/值,但是在您的情况下,这不会是个好主意,因为根本上您正在做难以置信的危险的事情,即连接输入以创建SQL。现在,您的存储过程是一个SQL注入孔,可用于以最小的努力接管服务器。如果您同意窃取数据并销毁数据库,可以像其他操作一样内联/连接@Title1Item
,但是:这是一个糟糕的主意,它将伤害了你。
答案 2 :(得分:-1)
您可以将类型添加到参数
Sub FacsetDates2()
Dim Lastrow As Long
Dim c As Range
Dim currentRow As Long
Dim currentColumn As String
' Store a reference to the active cell
Set c = ActiveCell
' Get the row number and column name of the active cell
currentRow = c.Row
currentColumn = Replace(c.Address, currentRow, "")
' Get the row number of the bottom cell in column A
Lastrow = Cells(Rows.Count - 1, 1).End(xlUp).Row
Range(c.Address & ":" & currentColumn & Lastrow).FormulaR1C1 = "=+DATE(RIGHT(RC[-1],4),MONTH(""1 ""&MID(RC[-1],4,3)),LEFT(RC[-1],2))"
End Sub
存储过程也不会返回结果,但是您的SP会返回。这不是一个好习惯-在这种情况下,您将无法创建Datacontext(EF始终会为SP生成int返回结果),降低了执行性能,并创建了维护程度较低且不清楚的代码。但是没有人禁止你这样做。
关于SP的定义: cmd.Parameters.Add("@Title1Item", SqlDbType.Bit).Value =
Title1Item;
应该类似于where @Title1Item = Title1Item