2015-08-04 4 views
0

Я новичок в C#. Мне нужно получить входные данные из формы Windows и выполнить инструкцию sql. Здесь я должен получить имя таблицы и имя столбца от пользовательских входов. Я написал такой код.Динамическое определение имени таблицы и столбца в операторе SQL

string ment = String.Format("update {0} set {1} ='" + radioButton1.Text + "' where RoomId='" + textBox8.Text + "'", textBox7.Text, comboBox1.SelectedItem); 
cmd = new SqlCommand(ment, con); 
cmd.ExecuteNonQuery(); 

Это дает исключение.

В нем говорится: «Неправильный синтаксис рядом с« - ».

Любая идея о том, что я пропустил?

+6

Что ваш ' выглядит '' когда вы отлаживаете свой код? Каков ваш тип столбца «RoomId»? Каковы ваши ценности? Вы всегда должны использовать [параметризованные запросы] (http://blog.codinghorror.com/give-me-parameterized-sql-or-give-me-death/). Этот тип конкатенаций строк открыт для [SQL Injection] (http://en.wikipedia.org/wiki/SQL_injection) атак. И ваш 'comboBox1.SelectedItem' должен быть' comboBox1.SelectedItem.Text', на мой взгляд. –

+0

У него нет опции в виде combobox1.SelectedItem.Text –

+0

'comboBox1.SelectedItem' и' comboBox1.Text' должны быть в порядке. Но немного сложно сказать, что случилось с синтаксисом, если мы не знаем, как выглядит запрос. :) – waka

ответ

1

Имя вашего имени таблицы или столбца может иметь inproper символов. Оберните их символом `в MySQL или скобках в MSSQL.

MSSQL версия.

string ment = String.Format("update [{0}] set [{1}] ='" + radioButton1.Text + "' where RoomId='" + textBox8.Text + "'", textBox7.Text, comboBox1.SelectedItem); 
cmd = new SqlCommand(ment, con); 
cmd.ExecuteNonQuery(); 

Версия для MySQL.

string ment = String.Format("update `{0}` set `{1}` ='" + radioButton1.Text + "' where RoomId='" + textBox8.Text + "'", textBox7.Text, comboBox1.SelectedItem); 
cmd = new SqlCommand(ment, con); 
cmd.ExecuteNonQuery(); 
0

я знаю, эта нить старый, но правильный ответ выше от @han является SQL Injection склонными ..

Вы можете использовать QuoteIndetifier, вот пример

StringBuilder SQLtext = new StringBuilder(); 
      SqlCommandBuilder sqlBuilder = new SqlCommandBuilder(); 
      string MyColumn = sqlBuilder.QuoteIdentifier(Radio_range.SelectedValue); 
      SQLtext.AppendLine(" With ctemp as("); 
      SQLtext.AppendLine(" select convert(varchar(10),sysDate,102) sysDate,convert(varchar(10),WeekDate,102) WeekDate,[Month],[Quarter],[Year] "); 
      SQLtext.AppendLine(" from sysCalendar "); 
      SQLtext.AppendLine(" where sysdate<=(select max(nominal_date) from ATTENDANCE_AGENT_T) "); 
      SQLtext.AppendLine(" and sysDate>=dateadd(MONTH,-12,getdate()) "); 
      SQLtext.AppendLine(") "); 
      SQLtext.AppendFormat(" select distinct {0} as mydate from ctemp order by {1} desc ", MyColumn, MyColumn); 
      string constr = ConfigurationManager.ConnectionStrings["CIGNAConnectionString"].ConnectionString; 
      using (SqlConnection con = new SqlConnection(constr)) 
      { 
       using (SqlCommand cmd = new SqlCommand(SQLtext.ToString())) 
       { 
        cmd.CommandType = CommandType.Text; 
        //cmd.Parameters.AddWithValue("@mydate", Radio_range.SelectedValue); 
        cmd.Connection = con; 
        con.Open(); 
        DropDownList_Date.DataSource = cmd.ExecuteReader(); 
        DropDownList_Date.DataTextField = "mydate"; 
        DropDownList_Date.DataValueField = "mydate"; 
        DropDownList_Date.DataBind(); 
        con.Close(); 
       } 
      } 
Смежные вопросы