2012-02-21 2 views
1

운영자 입력을 기반으로 수행해야하는 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 
+0

분할에게 [1] 무엇이 포함되어 있습니까를? 숫자 또는 문자열입니까? 예를 들어, cmd.Parameters.AddWithValue (string.Format ("@ {0}", split [0]), Convert.ToString (split [1])); 다른 결과가 나올까요? 문자열 인 경우 split [1]에 이미 따옴표가 있습니까? 만약 그렇다면 도랑을 파낼 필요가 있습니다. – dash

+0

"declare ... nvarchar (50)"및 "set"단어가 어디에서 왔는지 혼란 스럽습니다. 나는 "test"변수를 보았지만, @ WorkOrder = 100883을 읽는 것으로 보인다. 수동으로 추가 했습니까? –

+1

@ron : 첫 번째 스 니펫은 ADO.NET 부분이며 두 번째 스 니펫은 SSMS의 순수 SQL을 사용하여 쿼리를 테스트합니다. –

답변

1

아포스트로피 문제가 split [1]에서 발생한다고 생각합니다. " '100883'"문자열을 찾기 위해 노력 데이터베이스 대신에 "100883"

이 작은 해킹 시도하십시오 :

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

columnFilter = "WorkOrder = '100883'으로 전달되었으므로 columnFilter ="WorkOrder = 100883 ";-)로 변경하는 것이 더 쉽습니다. – dash

+0

Radek! dash가 댓글에서 언급했으나 실행되지 않았습니다. – jp2code

+0

실제로, 내 코드는 실제적으로 문자열에 '작은 따옴표'를 넣으므로 더 이상 코드를 변경하지 않아도됩니다 .QW. – jp2code

관련 문제