Ошибка SQL при вставке статистики с элементами управления во время выполнения - PullRequest
1 голос
/ 02 сентября 2010

Я использую C #, VS 2005 и SQL 2000

Мой код:

StringBuilder sb = new StringBuilder();
sb.Append("insert into dummy(name,amount)values");
foreach (Control ctl in this.flowLayoutPanel1.Controls) 
{
  if (ctl.Name.Contains("tb") && ctl is TextBox) 
  {
     sb.Append(ctl.Text);
  }
} 

foreach(Control bbl in this.flowLayoutPanel1.Controls)
{
   if(bbl.Name.Contains("bb") && bbl is TextBox)
   {
     sb.Append(bbl.Text);
   }
}

SqlCommand cmd = new SqlCommand(sb.ToString(), con);
cmd.CommandType = CommandType.Text;
cmd.ExecuteNonQuery();

Выдает ошибку вроде этого:

Неверный синтаксис рядом со значениями

Пожалуйста, помогите мне.

Ответы [ 3 ]

1 голос
/ 02 сентября 2010

@ Ардман упомянул синтаксические ошибки, но есть кое-что гораздо более важное: вы должны не добавлять введенные пользователем значения в ваш SQL следующим образом.

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

1 голос
/ 02 сентября 2010

Сами значения должны быть в скобках и также разделяться запятыми.

Я думаю, что ваш код производит это:

insert into dummy(name,amount)valuesthisname100

Но вам нужно изменить это, чтобы произвести это:

INSERT INTO dummy (name, amount) VALUES ('thisname', 100)

пример кода, который сделает это:

StringBuilder sb = null;
sb = new StringBuilder();
sb.Append("insert into dummy(name,amount)values (");
foreach (Control ctl in this.flowLayoutPanel1.Controls) 
{
   if (ctl.Name.Contains("tb") && ctl is TextBox) 
   {
      sb.Append("'" + ctl.Text + "'");
   }
} 
sb.Append(", ");
foreach(Control bbl in this.flowLayoutPanel1.Controls)
{
   if(bbl.Name.Contains("bb") && bbl is TextBox)
   {
       sb.Append(bbl.Text);
   }
}
sb.Append(")");
SqlCommand cmd1 = new SqlCommand(sb.ToString(), con);
cmd1.CommandType = CommandType.Text;
cmd1.ExecuteNonQuery();

Этот код далек от идеала, но он должен исправить вашу ошибку синтаксиса SQL. Некоторые другие улучшения, о которых вы должны подумать:

  • Убедитесь, что в каждом цикле foreach найдено только одно текстовое поле. Если их больше одного, количество полей не будет совпадать.
  • Вставьте код проверки или исправления, чтобы в тексте, введенном пользователем, не появлялись одинарные кавычки, или измените SQL для использования параметров (спасибо Jon Skeet ).
  • Поставьте проверку, чтобы убедиться, что ваше второе текстовое поле может быть проанализировано как число (см. Int.TryParse ()), при условии, что ваше поле Amount является числовым.

Однако гораздо лучше было бы сделать это ( EDITED , чтобы помочь mahesh с его кодированием, теперь включает несколько вставок):

string sName = null;
double? nAmount = null;

foreach (Control ctl in this.flowLayoutPanel1.Controls) 
{
   if (ctl.Name.Contains("tb") && ctl is TextBox) sName = ctl.Text;
   if (ctl.Name.Contains("bb") && ctl is TextBox) 
   {
       double nTmp = 0;
       if (double.TryParse(ctl.Text, out nTmp)) nAmount = nTmp;
   }

   if (sName != null && iAmount != null) 
   {
      SqlCommand cmd1 = new SqlCommand("INSERT INTO dummy (name, amount) VALUES (@name, @amount)", con);
      cmd1.Parameters.Add("@name", SqlDbType.VarChar).Value = sName;
      cmd1.Parameters.Add("@amount", SqlDbType.Decimal).Value = nAmount;
      cmd1.ExecuteNonQuery();
      sName = null;
      nAmount = null;
   }
}
1 голос
/ 02 сентября 2010

Похоже, вам не хватает пробела после скобок и после VALUES. И вам не хватает открывающей и закрывающей скобок для вашего VALUES заявления. Вам также нужно будет добавить запятые после значений, которые вы вставляете, чтобы разделить их. Таким образом, ваш синтаксис должен выглядеть примерно так:

insert into dummy(name,amount) values (textBox1value, textBox2value)

EDIT

Предполагая, что в ваших элементах flowLayoutPanels есть только 2 элемента управления TextBox, вы можете сделать следующее:

StringBuilder sb = null; 
sb = new StringBuilder(); 
sb.Append("insert into dummy(name,amount)values ("); 
foreach (Control ctl in this.flowLayoutPanel1.Controls)  
{ 
   if (ctl.Name.Contains("tb") && ctl is TextBox)  
  { 
     sb.Append(ctl.Text); 
  } 
}  

sb.Append(",");

foreach(Control bbl in this.flowLayoutPanel1.Controls) 
{ 
   if(bbl.Name.Contains("bb") && bbl is TextBox) 
   { 
    sb.Append(bbl.Text); 
   } 
} 

sb.Append(")");

Но я бы настоятельно хотел рассмотреть решение, предложенное Джоном.

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