Как вставить в файл DBF (foxpro) - PullRequest
5 голосов
/ 08 февраля 2012

У меня есть следующий код в asp.net:

using (OleDbCommand command = dbConnW.CreateCommand())
{
    string CreateTableK = null;
    CreateTableK += "Create Table DSKKAR00 (DSK_ID c(10),DSK_KIND N(1),MON_PYM C(3))";
    OleDbCommand cmdCreateTable = new OleDbCommand(CreateTableK, dbConnW);
    cmdCreateTable.ExecuteNonQuery();
    System.Text.StringBuilder sb = new  System.Text.StringBuilder();
    sb.Append(WorkRoomNo + ","); 
    sb.Append("1,");
    sb.Append(",");
    OleDbCommand cmd3 = new OleDbCommand("Insert into DSKKAR00 (DSK_ID,DSK_KIND,MON_PYM) Values (" + sb.ToString() + ")", dbConnW);
    cmd3.ExecuteNonQuery();

Но у меня есть следующая ошибка:

Синтаксическая ошибка

Ответы [ 2 ]

7 голосов
/ 09 февраля 2012

В дополнение к тому, что предложил Крис, вы начинаете свой CREATE TABLE со строковой переменной NULL, затем делаете + = к ней. Из того, что я помню, NULL + = "anystring" останется нулевым значением ... Возможно, у вас тоже происходит сбой.

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

string CreateTableK = 
   "Create Table DSKKAR00 (DSK_ID c(10),DSK_KIND N(1),MON_PYM C(3))";     

OleDbCommand cmdCreateTable = new OleDbCommand(CreateTableK, dbConnW);
cmdCreateTable.ExecuteNonQuery();     

string MyInsert = 
   "insert into DSKKAR00 ( dsk_id, dsk_kind, mon_pym ) values ( ?, ?, ? )";
OleDbCommand cmd3 = new OleDbCommand( MyInsert, dbConnW);
cmd3.Parameters.AddWithValue( "parmSlot1", WorkRoomNo );
cmd3.Parameters.AddWithValue( "parmSlot2", 1);
cmd3.Parameters.AddWithValue( "parmSlot3", 'tst' ); // or whatever variable to put
cmd3.ExecuteNonQuery(); 
3 голосов
/ 08 февраля 2012

Во-первых, каждый раз, когда у вас возникает ошибка, обычно лучше отправить сообщение об ошибке whole .

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

Говоря о том, что, глядя на свой код, вы объединяете строку, и действительно похоже, что у вас слишком много запятых.

Отправленный запрос выглядит так:

insert into DSKKAR00(DSK_ID, DSK_KIND, MON_PYM) VALUES( X,1, ,)

где X - значение вашей переменной WorkRoomNo.

Очевидно, что это неправильный синтаксис и приведет к ошибке, которую вы видели. Запятые указывают, что передается 4 значения, но запрос вставки идентифицирует только 3 столбца.

Следующая проблема связана с самими определениями столбцов. Первый столбец этой таблицы - c (10); третий является с (3). Я немного ржавый, но разве это не те поля персонажей?

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

Что приводит нас к последней проблеме: не используйте конкатенацию строк для построения запросов. Используйте Параметризованные запросы

...