T-SQL查询不填充DataTable

时间:2012-02-21 20:54:42

标签: c# sql visual-studio-2010 tsql

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

我正在构建一个表格,其中包含一个下拉框,其中填充了表格列和一个文本框,供他们提供数据。

SQL语句是使用SQL Management Studio 2008构建的。我测试了它(columnFilter="WorkOrder='100883'"),并返回18行数据。

当我将相同的数据传递给我在下面编写的方法时,没有错误,SQL与我在管理工作室中完全相同,但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 

1 个答案:

答案 0 :(得分:1)

我认为这个问题是分裂[1]中的撇号。数据库试图找到“'100883'”字符串而不是“100883”

请尝试这个小黑客:

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