簡體   English   中英

記錄數不等

[英]Varying number of records

我正在從我的C#代碼執行SQL Server存儲過程,該過程實際上是根據提供的條件從數據庫中提取了一些數據。

DataSet GetAllxxxxxByDate(string entityValue,string companyValue)
{
    using (var sqlConn = new SqlConnection(GetConnectionString()))
    {
        using (var cmd = new SqlCommand())
        {
            var data = new DataSet();
            cmd.CommandText = “myStoredprodecure”;
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Connection = sqlConn;

            var eVal = string.IsNullOrWhiteSpace(entityValue) ? string.Empty : entityValue;
            cmd.Parameters.AddWithValue("@entity_value", eVal);

            var company = string.IsNullOrWhiteSpace(companyValue) ? string.Empty : companyValue;
            cmd.Parameters.AddWithValue("@company", company);

            var sqlDataAdaptor = new SqlDataAdapter(cmd);
            sqlDataAdaptor.Fill(data);

            return data;
         }
     }
}

在這里, entityValuecompanyValue是逗號分隔的字符串,在C#代碼中動態形成並將其傳遞給存儲過程。

例如:

’first’,’second’,’third’

並且存儲過程使用這些值來填充其中定義的NOT IN條件。

問題是,當我執行代碼時,記錄數不一致。

以下是一個快速屏幕截圖,其中第一個WHERE子句返回3條記錄,第二個WHERE子句返回1條記錄。 第一個WHERE子句的輸入值由c#代碼填充,第二個WHERE子句的輸入值由手動填充以進行測試。

C#執行結果和手動執行結果

我能發現的唯一區別是報價數量。

問題:有人可以幫助我將問題零或將WHERE子句中的區別歸零嗎?

好吧,您沒有顯示結果中的entity_value ,但是兩者之間的區別是您在文字值周圍添加了單引號:

SQL中的N'''FSEC'''是字面值'FSEC'

SQL中的'FSEC'只是FSEC (不帶引號)。

我的猜測是,記錄2004981和2004982具有的價值FSEC為(不帶引號) entity_value

如果要從C#代碼中添加參數值,請不要像在構建字符串時那樣在其周圍添加引號。 SQL會將值視為字符串,而無需字符串限定符。

編輯

好吧,我剛剛讀了下面的聲明:

在這里,entityValue,companyValue是逗號分隔的字符串

您不能只將逗號分隔的字符串傳遞給IN子句。 要搜索多個值,有幾個選項:

  • 在兩端添加逗號並使用LIKE:

     Where (',' + @entity_value +',' LIKE '%,' + entity_value + ',%') 
  • 將字符串解析為臨時表,而不是在IN子句中使用該表

  • 將值作為表值參數傳遞,並在IN子句中使用它。
  • 將SQL語句構建為字符串並使用EXEC

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM