我必须根据操作员输入执行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
答案 0 :(得分:1)
我认为这个问题是分裂[1]中的撇号。数据库试图找到“'100883'”字符串而不是“100883”
请尝试这个小黑客:
cmd.Parameters.AddWithValue(string.Format("@{0}", split[0]), split[1].Replace("'",""));