운영자 입력을 기반으로 수행해야하는 SQL
쿼리가 있습니다.T-SQL 쿼리가 DataTable을 채우지 않습니다.
테이블 열과 데이터를 제공하는 텍스트 상자가있는 드롭 다운 상자가있는 양식을 작성합니다.
SQL
문은 SQL Management Studio 2008을 사용하여 작성되었습니다. 테스트 한 결과 (columnFilter="WorkOrder='100883'"
), 18 개의 데이터 행을 반환합니다.
아래와 같은 방법으로 동일한 데이터를 전달하면 오류가 없습니다. SQL
은 Management Studio에 구멍을 뚫은 것과 완전히 같지만 DataTable
에는 데이터가 없습니다.
몇 가지 시도를했기 때문에 코드를 조금 정리할 수는 있었지만 여전히 논리적으로 유효합니다 ... 단지 논리적 인입니다.
Please Please! 누군가 내가 뭘 잘못하고 있다고 말할 수 있습니까? (나는 그것이 실수이고, 하나는 데이터 유형을 알 수 없습니다 의미 생각하기 때문에)
나는 일반적으로 AddWithValue
매개 변수 옵션을 사용하지 않지만,이 경우에 나는 데이터 유형을 모르는 (?). 이 방법은 내 문제와 관련이 있을지도 모릅니다.하지만이를 확인하는 방법을 모르겠습니다. 나는 (예쁘고 읽을 수 있도록 포맷) 같은 SQL 문이 모습을 보여 드리겠습니다 지금
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}][email protected]{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;
}
:
첫째, 난 당신에게 코드를 보여주지
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][email protected]
ORDER BY E.DateStamp, WorkOrder, PartNumber
분할에게 [1] 무엇이 포함되어 있습니까를? 숫자 또는 문자열입니까? 예를 들어, cmd.Parameters.AddWithValue (string.Format ("@ {0}", split [0]), Convert.ToString (split [1])); 다른 결과가 나올까요? 문자열 인 경우 split [1]에 이미 따옴표가 있습니까? 만약 그렇다면 도랑을 파낼 필요가 있습니다. – dash
"declare ... nvarchar (50)"및 "set"단어가 어디에서 왔는지 혼란 스럽습니다. 나는 "test"변수를 보았지만, @ WorkOrder = 100883을 읽는 것으로 보인다. 수동으로 추가 했습니까? –
@ron : 첫 번째 스 니펫은 ADO.NET 부분이며 두 번째 스 니펫은 SSMS의 순수 SQL을 사용하여 쿼리를 테스트합니다. –