T-SQL查询不填充DataTable

本文关键字:DataTable 填充 查询 T-SQL | 更新日期: 2023-09-27 18:25:16

我有一个SQL查询,必须根据操作员输入执行。

我正在构建一个表单,它有一个用表列填充的下拉框和一个用于提供数据的文本框。

SQL语句是使用SQL Management Studio 2008生成的。我对它进行了测试(其中columnFilter="WorkOrder='100883'"),它返回了18行数据。

当我将相同的数据传递给我在下面写的方法时,没有错误,SQL与我在Management Studio中输入的完全相同,但DataTable中从未有任何数据。

代码可能需要一些清理,因为我已经尝试了一些不同的东西,但它在逻辑上仍然有效。。。只是目前不是最符合逻辑的。

请!有人能告诉我我做错了什么吗

我通常不使用AddWithValue参数选项(因为我认为它很草率,意味着人们不知道数据类型),但在这种情况下,我不知道数据的类型(?)。我怀疑这种方法可能与我的问题有关,但我不知道如何检查它。

首先,我给你看代码:

public DataTable GetSheetMetalRequest(string columnFilter) {
  DataTable table = new DataTable();
  string sqlText = null;
  string[] split = !String.IsNullOrEmpty(columnFilter) ? columnFilter.Split('=') : new string[] { String.Empty };
  if (split.Length == 2) {
    StringBuilder sb = new StringBuilder("SELECT ");
    sb.Append("V.DateStamp, WorkOrder, PartNumber, Qty, EmployeeID, ");
    sb.Append("CAST(P.ProductionLineID AS VARCHAR(10))+': '+ProductionLine AS 'AcpLine', ");
    sb.Append("MTF, CAST(V.EventStatusID AS VARCHAR(10))+': '+[Status] AS 'AcpStatus', ");
    sb.Append("V.RequestID, ReasonID, E.DateStamp AS 'StartDate' ");
    sb.Append("FROM vwSheetMetalRequestByEvent V ");
    sb.Append("INNER JOIN ProductionLines P ON (V.ProductionLineID=P.ProductionLineID) ");
    sb.Append("INNER JOIN [Event] E ON (V.RequestID=E.RequestID) ");
    sb.Append("WHERE V.RequestID IS NOT NULL AND E.EventStatusID=1"); // EventStatusID=SheetMetalRequest
    sb.Append(string.Format(" AND [{0}]=@{0}", split[0]));
    sb.Append(" ORDER BY E.DateStamp, WorkOrder, PartNumber ");
    sqlText = sb.ToString();
  }
  if (!String.IsNullOrEmpty(sqlText)) {
    using (SqlCommand cmd = new SqlCommand(sqlText, Conn_Tracker)) {
      cmd.CommandType = CommandType.Text;
      cmd.Parameters.AddWithValue(string.Format("@{0}", split[0]), split[1]);
      string test = string.Format("{0}={1}", cmd.Parameters[0].ParameterName, cmd.Parameters[0].Value);
      Console.WriteLine(test); // ""
      try {
        cmd.Connection.Open();
        table.Load(cmd.ExecuteReader());
        if (table.Rows.Count < 1) {
          Console.WriteLine("no data");
        }
      } catch (Exception err) {
        LogError("GetSheetMetalRequest", err);
      } finally {
        cmd.Connection.Close();
      }
    }
  }
  return table;
}

现在,我将向您展示SQL语句的外观(格式化为美观可读):

declare @WorkOrder nvarchar(50)
set @WorkOrder='100883'
SELECT
  V.DateStamp, WorkOrder, PartNumber, Qty, EmployeeID, 
  CAST(P.ProductionLineID AS VARCHAR(10))+': '+ProductionLine AS 'AcpLine', 
  MTF, CAST(V.EventStatusID AS VARCHAR(10))+': '+[Status] AS 'AcpStatus', 
  V.RequestID, ReasonID, E.DateStamp AS 'StartDate' 
FROM vwSheetMetalRequestByEvent V 
  INNER JOIN ProductionLines P ON (V.ProductionLineID=P.ProductionLineID) 
  INNER JOIN [Event] E ON (V.RequestID=E.RequestID) 
WHERE
  V.RequestID IS NOT NULL AND 
  E.EventStatusID=1 AND 
  [WorkOrder]=@WorkOrder 
ORDER BY E.DateStamp, WorkOrder, PartNumber 

T-SQL查询不填充DataTable

我想问题是split[1]中的撇号。数据库试图查找"100883"字符串,而不是"100883"

请尝试这个小技巧:

cmd.Parameters.AddWithValue(string.Format("@{0}", split[0]), split[1].Replace("'",""));