C # String Concationation Проблема, почему не работает + = здесь? - PullRequest
1 голос
/ 14 февраля 2012

У меня есть следующий код c #:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace StringTest
{
    class Program
    {
        static void Main(string[] args)
        {

               String strSQLCode;
            strSQLCode = " select rank() over (order by percentagecorrect desc, totalmilliseconds asc) as rank, * "
                      += " from view_dg_game_details gd (nolock) "
                      += " where gd.gametypeid = {0} " 
                      += " and gd.numberofrounds = {1} "
                      += " and gd.gamevalues = '{2}' ";
        }
    }
}

По какой-то причине я получаю сообщение об ошибке "Левая часть присваивания должна быть переменной, свойством или индексатором".

Я не вижу, что ошибка пытается мне сказать.Я закомментировал оскорбительную строку, но ошибка просто перемещается вверх по строке.

Я могу заставить строку работать, используя этот метод:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace StringTest
{
    class Program
    {
        static void Main(string[] args)
        {

            String strSQLCode;
            strSQLCode = " select rank() over (order by percentagecorrect desc, totalmilliseconds asc) as rank, * ";
            strSQLCode = strSQLCode +  " from view_dg_game_details gd (nolock) ";
            strSQLCode = strSQLCode + " where gd.gametypeid = {0} ";
            strSQLCode = strSQLCode + " and gd.numberofrounds = {1} ";
            strSQLCode = strSQLCode + " and gd.gamevalues = '{2}' ";            
        }
    }
}

Может кто-нибудь объяснить мне, о чем эта ошибка?

Спасибо

Кен

Ответы [ 10 ]

12 голосов
/ 14 февраля 2012

Поскольку вы не можете связать вместе += операторы без повторения переменной, с которой вы работаете:

strSQLCode = @"select rank() over (order by percentagecorrect desc, 
                                            totalmilliseconds asc) as rank, * ";
strSQLCode += " from view_dg_game_details gd (nolock) ";
strSQLCode += " where gd.gametypeid = {0} ";
strSQLCode += " and gd.numberofrounds = {1} ";
strSQLCode += " and gd.gamevalues = '{2}' ";

Если вы хотите объявить его как "длинный" один вкладыш, просто используйте+

strSQLCode = @"select rank() over (order by percentagecorrect desc, 
                                            totalmilliseconds asc) as rank, * "
           + " from view_dg_game_details gd (nolock) "
           + " where gd.gametypeid = {0} " 
           + " and gd.numberofrounds = {1} "
           + " and gd.gamevalues = '{2}' ";

Или, если вы не хотите ничего из этого, вы можете просто использовать один строковый литерал:

strSQLCode = 
    @"select rank() over (order by percentagecorrect desc, 
                                totalmilliseconds asc) as rank, *
      from view_dg_game_details gd (nolock)
      where gd.gametypeid = {0}
          and gd.numberofrounds = {1}
          and gd.gamevalues = '{2}' ";
3 голосов
/ 14 февраля 2012

Это одно утверждение, поэтому вы должны использовать следующее:

        strSQLCode = " select rank() over (order by percentagecorrect desc, totalmilliseconds asc) as rank, * "
                  + " from view_dg_game_details gd (nolock) "
                  + " where gd.gametypeid = {0} " 
                  + " and gd.numberofrounds = {1} "
                  + " and gd.gamevalues = '{2}' ";
2 голосов
/ 14 февраля 2012

Просто используйте это так

strSQLCode = " select rank() over (order by percentagecorrect desc, totalmilliseconds asc) as rank, * "
            + " from view_dg_game_details gd (nolock) "
            + " where gd.gametypeid = {0} "
            + " and gd.numberofrounds = {1} "
            + " and gd.gamevalues = '{2}' ";

или

strSQLCode = 
          @"select rank() over (order by percentagecorrect desc, totalmilliseconds asc) as rank, * 
            from view_dg_game_details gd (nolock) 
            where gd.gametypeid = {0} 
            and gd.numberofrounds = {1} 
            and gd.gamevalues = '{2}' ";
2 голосов
/ 14 февраля 2012

Вы пишете

something += "a" += "b";

Это не имеет смысла.

2 голосов
/ 14 февраля 2012

В вашем первом фрагменте кода вы не должны использовать += Простое будет делать +

Из MSDN:

Выражение с использованием + =Оператор присваивания, такой как

x += y

, эквивалентен

x = x + y

за исключением того, что x оценивается только один раз.

Это означает, что вы не можете использовать += для объединения в цепочку набора строковых литералов или более двух переменных.

2 голосов
/ 14 февраля 2012

Для вашего первого фрагмента вам нужно получить +, а не +=.

Вы хотите присвоить переменную только один раз, и вы делаете это после объединения всех частей вместе обычным способом. И это +.

1 голос
/ 15 февраля 2012

, как и все остальные, упомянул + = должен быть +.Пожалуйста, если ваш конструктор SQL хотя бы параметризует его, внедрение SQL является серьезной проблемой.Я мог бы из консоли или winapp текстовые поля удалить таблицы в вашей БД.Из первой переменной вы можете сделать

 1 ; drop table dg_game_details --

пример:

conDatabase =
new SqlConnection("Data Source=(local);" +
"Database='projectGames';" +
"Integrated Security=true");
SqlCommand cmdDatabase =
new SqlCommand("SELECT rank() over (order by percentagecorrect desc, totalmilliseconds asc) as rank, * FROM view_dg_game_details gd (nolock)" +
"WHERE gd.gametypeid= @GameId;", conDatabase);

cmdDatabase.Parameters.Add("@GameId", SqlDbType.Int);
cmdDatabase.Parameters["@GameId"].Value = 1;
1 голос
/ 14 февраля 2012

То, что вы делаете, эффективно:

string variable = "string" += "another string";

это, по сути, то же самое, что:

string variable;
(variable = "string") += "another string";

Поскольку результатом выражения в скобках является строка (в частности, значениекоторый был назначен), теперь вы фактически делаете это:

string variable;
variable = "string";
"string" += "another string;

И у компилятора есть проблема с этой третьей строкой.

В частности, компилятор говорит вам, что вЧтобы выполнить назначение, вам нужно что-то назначить.

Напишите это так:

strSQLCode = @" select rank() over (order by percentagecorrect desc, totalmilliseconds   asc) as rank, *
    from view_dg_game_details gd (nolock) 
    where gd.gametypeid = @gameType 
    and gd.numberofrounds = @numberOfRounds
    and gd.gamevalues = @gameValues ";

И используйте параметризованный запрос.

1 голос
/ 14 февраля 2012

Ваш синтаксис немного неправильный.

Должно быть:

namespace StringTest
{
    class Program
    {
        static void Main(string[] args)
        {

               String strSQLCode;
            strSQLCode = @" select rank() over (order by percentagecorrect desc, totalmilliseconds asc) as rank, * "
                      + @" from view_dg_game_details gd (nolock) "
                      + @" where gd.gametypeid = {0} " 
                      + @" and gd.numberofrounds = {1} "
                      + @" and gd.gamevalues = '{2}' ";
        }
    }
}
0 голосов
/ 14 февраля 2012

Используйте + вместо + =.

Кроме того, я настоятельно рекомендую не хранить и не объединять ваши SQL-запросы, как это, потому что таким образом это очень небезопасно из-за SQL-инъекций.

Подробнее оэто здесь: SQL-инъекция

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...