传递布尔值时必须声明标量变量

时间:2019-06-04 12:54:46

标签: c# sqlexception

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
)

3 个答案:

答案 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#代码。它无法以书面形式运行。参数和局部变量不是“环境”的-它们不会在EXECEXECUTE块内定义,因为它们的作用域不在此范围内。在某些情况下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