исключение с sql и кодом c#

Я плохо знаком с C# и sql. У меня есть функция в c#, который ищет таблицу базы данных конкретный отчет моя функция

 public string returnstudentdata(string primarykey, string table, string regno, string column)
    {
        string temp = "";
        if (conn.State == ConnectionState.Closed)
        {
            conn.Open();
        }

        SqlCommand newCmd = conn.CreateCommand();
        newCmd.Connection = conn;
        newCmd.CommandType = CommandType.Text;
        newCmd.CommandText = "SELECT" + column + "FROM" + table + "WHERE" + primarykey + "=" + regno + "";
        SqlDataReader dr = newCmd.ExecuteReader();
        while (dr.Read())
        {
            temp = dr[column].ToString();
        }
        dr.Close();
        conn.Close();
        return temp;
    }

этот код выполняет правильно, но когда дело доходит до SqlDataReader доктор = newCmd. ExecuteReader (); это бросает исключение, указывающее:

Необработанное исключение типа 'Система. Данные. SqlClient. SqlException' произошел в Системе. Data.dll

Дополнительная информация: Неправильный синтаксис рядом '='.

заявление запроса

 string regno = txtRegNo.Text;
 txtFName.Text = update.returnstudentdata("Regno","student",regno,"Fname");

Какова проблема с моей помощью code.please

1
Я попробовал SELECTFnameFROMstudentWHERERegno=whatever и это didn' t работают на меня также!
добавлено автор Devin Burke, источник
There' s тонны проблем... (1) необходимо использовать параметризированные запросы, как you' у ре, уязвимого для Внедрений SQL, (2), если вы принимаете решение проигнорировать этот совет, вы все еще, нет мест aroud ни одно из ваших слов, таким образом, ваш SQL-запрос - один большой дополнительный вопрос как SELECTcolumnFROMtableWHEREpk=regno , и (3) вы didn' t обертывают ваш regno последовательность с апострофами. Так, короче говоря, используйте параметризированные запросы. Я должен полностью зарегистрироваться useparameterizedqueries.com .
добавлено автор LittleBobbyTables, источник

5 ответы

В минимуме вам нужны места в вашем sql заявлении:

newCmd.CommandText = "SELECT " + column + " FROM " + table + " WHERE " + primarykey + "=" + regno + "";
3
добавлено
спасибо за ответ. Я плохо знаком с sql. Привычка передает эту ошибку снова
добавлено автор Aravind Bharathy, источник
+1 для ответа на вопрос сначала.
добавлено автор Saju, источник

Поместите некоторые Места вокруг ключевых слов SQL в ваших кавычках, ваша последовательность не заканчивается в действительный код SQL:

newCmd.CommandText = "SELECT " + column + " FROM " + table + " WHERE " + primarykey + "=" + regno + "";

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

See this SO thread for more explanation: How do parameterized queries help against SQL injection?

2
добавлено

Ваш у CommandText , или запрос SQL, есть потенциал для большого количества ошибок.

Прежде всего, у вас нет мест между SQL-ключевыми-словами, такими как ИЗБРАННЫМИ , и ваши переменные (принимающий вас, переменные не дополнены местами):

newCmd.CommandText = "SELECT" + column + "FROM" + table + "WHERE" + primarykey + "=" + regno + "";

Необходимо сначала добавить места как это:

newCmd.CommandText = "SELECT " + column + " FROM " + table + " WHERE " + primarykey + "=" + regno + "";

Второе - то, что вы не обертываете ваш regno стоимость с кавычками. Теперь, это могло validy быть, потому что стоимость числовая; если это так, можно проигнорировать кавычки, и вопрос должен выполнить прекрасный (после того, как добавление мест отметило выше). Однако, если это будет последовательность, вы захотите обернуть стоимость в кавычки как это:

newCmd.CommandText = "SELECT " + column + " FROM " + table + " WHERE " + primarykey + "=\"" + regno + "\"";

Однако независимо, действительно ли стоимость числовая или последовательность, я на самом деле рекомендовал бы, чтобы вы использовали подготовленное заявление вместо этого. Можно достигнуть этого с:

newCmd.CommandText = "SELECT " + column + " FROM " + table + " WHERE " + primarykey + "[email protected]";
newCmd.Parameters.AddWithValue("@regNo", regno);

Подготовленное заявление поможет облегчить потребность в том, чтобы не забывать обернуть стоимость в кавычки (это будет обращаться с этим для вас), и также добавит безопасность к вашему вопросу, помогая предотвратить Внедрение SQL.

1
добавлено

Попробуйте это:

newCmd.CommandText = "SELECT " + column + " FROM " + table + " WHERE " + primarykey + " = '" + regno + "'";
1
добавлено

Эта линия не даст действительный SQL. Никакой spaces.-

newCmd.CommandText = "SELECT" + column + "FROM" + table + "WHERE" + primarykey + "=" + regno + "";
1
добавлено
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)