2013-07-04 6 views
1

Я просмотрел разные ссылки (например, one), но я все еще не могу получить, откуда это сообщение об ошибке. Я продолжаю считать столбцы, комы и т. Д., Не найдя, где проблема.«Количество столбцов не соответствует количеству значений в строке 1»

int exId = stride.getExerciseId(); 
string timestamp = stride.getTimeStamp(); 
int startSec = stride.getBeginningSec(); 
int startMsec = stride.getBeginningMSec(); 
int endSec = stride.getEndSec(); 
int endMSec = stride.getEndMSec(); 
float length = stride.getLength(); 
float duration = stride.getDuration(); 
float steplength = stride.getStepLength(); 
float stepDuration = stride.getStepDuration(); 
string supportingFoot = stride.getSupportingFoot(); 

string query = "INSERT INTO singlesupportstate (ExerciseId , TimeStamp , SingleSupportStateStartSeconds , SingleSupportStateStartMSeconds , SingleSupportStateEndSeconds , SingleSupportStateEndMSeconds , StrideLength , StrideDuration , StepLength , StepDuration , SupportingFoot) 
VALUES("+ exId +",'" + timestamp +"',"+ startSec +"," + startMsec + "," + endSec + "," + endMSec + "," + length +"," + duration + "," + steplength + "," + duration + ",'" + supportingFoot + "')"; 
if (this.OpenConnection() == true) 
{ 
    MySqlCommand cmd = new MySqlCommand(query, connection); 
    cmd.ExecuteNonQuery(); 
    this.CloseConnection(); 
} 

EDIT:

Так что я изменил код, чтобы использовать параметризованный запрос, вот новый код, который работает:

if (this.OpenConnection() == true) 
     { 
      MySqlCommand cmd = connection.CreateCommand() ; 
      cmd.CommandText = "INSERT INTO singlesupportstate (ExerciseId , TimeStamp , SingleSupportStateStartSeconds , SingleSupportStateStartMSeconds , SingleSupportStateEndSeconds , SingleSupportStateEndMSeconds , StrideLength , StrideDuration , StepLength , StepDuration , SupportingFoot) " 
       +" VALUES(@exId,@timestamp,@startSec,@startMsec,@endSec,@endMSec,@length,@duration,@steplength,@stepduration,@supportingFoot)"; 

      cmd.Parameters.Add("@exId", MySqlDbType.Int32); 
      cmd.Parameters.Add("@timestamp",MySqlDbType.Timestamp); 
      cmd.Parameters.Add("@startMsec",MySqlDbType.Int32); 
      cmd.Parameters.Add("@startSec",MySqlDbType.Int32); 
      cmd.Parameters.Add("@endSec",MySqlDbType.Int32); 
      cmd.Parameters.Add("@endMSec",MySqlDbType.Int32); 
      cmd.Parameters.Add("@length", MySqlDbType.Float); 
      cmd.Parameters.Add("@duration",MySqlDbType.Float); 
      cmd.Parameters.Add("@steplength",MySqlDbType.Float); 
      cmd.Parameters.Add("@stepduration", MySqlDbType.Float); 
      cmd.Parameters.Add("@supportingfoot", MySqlDbType.Text); 

      cmd.Parameters["@exId"].Value = exId; 
      cmd.Parameters["@timestamp"].Value = timestamp; 
      cmd.Parameters["@startMsec"].Value = startMsec; 
      cmd.Parameters["@startSec"].Value = startSec; 
      cmd.Parameters["@endSec"].Value = endSec; 
      cmd.Parameters["@endMSec"].Value = endMSec; 
      cmd.Parameters["@length"].Value = length; 
      cmd.Parameters["@duration"].Value = duration; 
      cmd.Parameters["@steplength"].Value =steplength; 
      cmd.Parameters["@stepduration"].Value =stepDuration; 
      cmd.Parameters["@supportingfoot"].Value =supportingFoot; 
      cmd.CommandTimeout = 120; 
      cmd.ExecuteNonQuery(); 
      this.CloseConnection(); 
     } 
+0

Здесь вы должны использовать параметризованные запросы. Возможно, один из параметров имеет дополнительный '' 'или что-то подобное –

+0

Возможно, что одно из значений, которое вы используете, либо заставляет SQL думать, что вы получил больше значений, чем столбцы. Вы можете распечатать, какое значение имеет запрос? Что это говорит? –

+0

Попробуйте вывести строку запроса или просмотреть ее в отладчике. Если вы не видите проблемы, отправьте строку запроса и свою структуру таблиц в виде синглов с вашим вопросом. –

ответ

0

Что, скорее всего, происходит это одна из двух вещей:

1) Есть ' кавычки делает запрос, кажется, имеет меньше значения, потому что он съедает запятые. 2) Существуют цифры, отформатированные с запятой, а не точкой, в результате число 123.45 показано как 123,45, что делает запрос о том, что существуют два целочисленных значения: 123 и 45, что приводит к слишком большому количеству значений.

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

+0

После более пристального изучения строки запроса кажется, что запятые поплавка являются причинами моей проблемы. благодаря –

2

Это означает, что в одном из значений в конкатенации нарушает INSERT, потому что он имеет разделитель запятой или строкой, таким образом разрушая целую строку query

Посмотрите на фактическую query строке после конкатенации, перед тем исполнения

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

Другой вариант - это триггер (saym для аудита или истории) на таблице singlesupportstate, в которой есть сломанный INSERT.

+0

Возможно ли это, чем запятые из чисел с плавающей точкой? –

+0

@FlorentGz: совершенно, да. Как я уже говорил * до того, как был принят принятый ответ – gbn

Смежные вопросы