2012-01-20 3 views
3

私の質問を徹底的に解決するために、私はGoogle、Bing、StackOvを投稿してから:-)投稿しました。また、私はMVC3の新機能であり、フレームワークの文法的な複雑さにも取り組んでいます。複数行のSQL文がエラーをスローする

以下のコードブロックで私のSQL文に誤りがあります。このコードブロックは、私にかなり迷惑をかけています。構文が正しく表示されます。私はSelect * From ..を使ってSQL文を単純化し、データを正常に返します。

また、(EFオブジェクトを使用せずに)これを行うより良い方法がある場合は、間違いなく提案を開きます。私はSQLステートメントを見るための柔軟性とコントロールが本当に好きです。

ありがとうございます!

@using System.Data.SqlClient; 
@using System.Configuration; 

@{ 
    Layout = null; 
} 
@{ 
    SqlConnection cn = null; 
    cn = new SqlConnection(ConfigurationManager.ConnectionStrings["sqlConn"].ToString()); 
    cn.Open(); 
    SqlCommand cmd = new SqlCommand((@"SELECT DISTINCT" + 
            "tblSBT.sname," + 
            "tblSBDetails.sid," + 
            "tblSBDetails.assignedtrack," + 
            "tblSBDetails.maxtrack," + 
            "tblSBDetails.currentvals," + 
            "tblSBDetails.maxvals," + 
            "tblSBDetails.lastupdated" + 
            "FROM" +   
             "tblSBT (NOLOCK)" + 
            "LEFT OUTER JOIN" + 
             "tblSBDetails (NOLOCK)" + 
            "ON" + 
             "tblSBT.sid = tblSBDetails.sid" +      
            "WHERE" + 
            "tblSBDetails.lastupdated > DateADD(n, -5, GETDATE())"+ 
            "ORDER BY" + 
            "tblSBT.sname" +), cn); 

    var myreader = cmd.ExecuteReader(); 
} 

答えて

14

@記号を使用している場合、どのように文字列を連結する必要はありません。そのような文字列を結合するときに、このコードを書くのが最も効率的な方法でもありません。これをデバッグする

SqlConnection cn = null; 
cn = new SqlConnection(ConfigurationManager.ConnectionStrings["sqlConn"].ToString()); 
cn.Open(); 
SqlCommand cmd = new SqlCommand((@"SELECT DISTINCT 
     tblSBT.sname, 
     tblSBDetails.sid, 
     tblSBT.sname, 
     tblSBDetails.sid, 
     tblSBDetails.assignedtrack, 
     tblSBDetails.maxtrack, 
     tblSBDetails.currentvals, 
     tblSBDetails.maxvals, 
     tblSBDetails.lastupdated 
     FROM tblSBT (NOLOCK) 
        LEFT OUTER JOIN tblSBDetails (NOLOCK) 
         ON .sid = tblSBDetails.sid 
     WHERE tblSBDetails.lastupdated > DateADD(n, -5, GETDATE()) 
     ORDER BY tblSBT.sname"), cn); 

var myreader = cmd.ExecuteReader(); 
+0

おかげさまで、私はMVC3を学んでいます:-) – mynameisneo

+0

ああ。私は答えを入力していたので、別の答えが投稿されたと私に言ったのと同じように投稿しました。私は自分の答えを削除することができないほど長く私を連れて行った。あなた自身をupvotedと考えてください。 –

3

文字列間にスペースを追加する必要があります。

SqlCommand cmd = new SqlCommand((@"SELECT DISTINCT " + 
            "tblSBT.sname," + 
            "tblSBDetails.sid," + 
            "tblSBDetails.assignedtrack," + 
            "tblSBDetails.maxtrack," + 
            "tblSBDetails.currentvals," + 
            "tblSBDetails.maxvals," + 
            "tblSBDetails.lastupdated" + 
            " FROM" +   
             " tblSBT (NOLOCK)" + 
            " LEFT OUTER JOIN" + 
             " tblSBDetails (NOLOCK)" + 
            " ON" + 
             " tblSBT.sid = tblSBDetails.sid" +      
            " WHERE" + 
            " tblSBDetails.lastupdated > DateADD(n, -5, GETDATE())"+ 
            " ORDER BY" + 
            " tblSBT.sname"), cn); 

multiline string literal @を使用しているため、文字列を連結しないでください。

SqlCommand cmd = new SqlCommand(@"SELECT DISTINCT tblSBT.sname,tblSBDetails.sid, 
           tblSBDetails.assignedtrack, 
           tblSBDetails.maxtrack, 
           tblSBDetails.currentvals, 
           tblSBDetails.maxvals, 
           tblSBDetails.lastupdated 
           FROM tblSBT (NOLOCK) 
           LEFT OUTER JOIN 
           tblSBDetails (NOLOCK) 
           ON tblSBT.sid = tblSBDetails.sid 
           WHERE tblSBDetails.lastupdated > DateADD(n, -5, GETDATE()) 
           ORDER BY tblSBT.sname",cn); 

;

+0

感謝です! – mynameisneo

2

より良い方法は、SQL ServerのMgmt(仮想ディスクの管理)Studioにそれをコピーして貼り付け、SQL文全体に=文字列変数を設定することであっただろう。あなたはおそらくコードが一緒に走っているのを見て、あなたの問題を特定しました。

また、私はここで@記号の使用を本当に理解しているとは思わない。 "SELECT DISTINCT"の最初の行だけがリテラルとして扱われ、連結している残りの文字列は文字列リテラルではなく文字列です。これは本当にこの場合は問題ではありません。あなたはおそらく何を意味するのか

は助けを

SqlCommand cmd = new SqlCommand((@"SELECT DISTINCT 
           tblSBT.sname, 
           tblSBDetails.sid, 
           tblSBDetails.assignedtrack, 
           tblSBDetails.maxtrack, 
           tblSBDetails.currentvals, 
           tblSBDetails.maxvals, 
           tblSBDetails.lastupdated 
           FROM 
            tblSBT (NOLOCK) 
           LEFT OUTER JOIN 
            tblSBDetails (NOLOCK) 
           ON 
            tblSBT.sid = tblSBDetails.sid      
           WHERE 
           tblSBDetails.lastupdated > DateADD(n, -5, GETDATE()) 
           ORDER BY 
           tblSBT.sname"), cn); 
+0

答えと明確化のおかげで、マット、私はあなただけでなく、他の誰もが – mynameisneo

関連する問題