SQL-оператор в нескольких строках с ошибкой - PullRequest
5 голосов
/ 20 января 2012

Для защиты своего вопроса я использовал Google, Bing и StackOv перед публикацией :-). Кроме того, я новичок в MVC3 и до сих пор борюсь с синтаксическими тонкостями фреймворка.

У меня есть ошибка в моем операторе SQL в блоке кода ниже, что вызывает у меня некоторые проблемы. Синтаксис выглядит правильным. Я упростил оператор SQL с помощью Select * From .., и он прекрасно возвращает данные.

Кроме того, если есть лучший способ сделать это (без использования объекта 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();
}

Ответы [ 3 ]

17 голосов
/ 20 января 2012

Если вы используете символ @, вам не нужно объединять строки, например, как вы это делаете.Это также не самый эффективный способ написания этого фрагмента кода, когда вы объединяете подобные строки.

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();
3 голосов
/ 20 января 2012

Вы должны добавить пробел между строками.

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); 

Не объединять строки, потому что вы используете многострочный литерал строки @.

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);

;

2 голосов
/ 20 января 2012

Лучшим способом отладки этого было бы установить строковую переменную = для всего оператора SQL, а затем скопировать и вставить ее в SQL Server Mgmt Studio.Возможно, вы видели код, работающий вместе, и определили вашу проблему.

Кроме того, я не думаю, что вы действительно понимаете использование символа @ здесь.Только ваша первая строка «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); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...