Консультация № 146010
04.10.2008, 21:04
0.00 руб.
0 13 2
Теперь такая проблема:

В одном месте своего проекта пытаюсь внести данные в базу данных:

Код:
  public void AddGame(string Aht, string note, string sol, string end)
{
string SQL_String =
"INSERT INTO Gold_Games_Table (Authors, Note, Solution, EndMessage)" +
"VALUES(@Aht, @note, @sol, @end)";
OleDbCommand comm = new OleDbCommand(SQL_String, conn);
OleDbParameter param1 = new OleDbParameter("@Aht", OleDbType.Char, 50);
param1.Value = Aht;
OleDbParameter param2 = new OleDbParameter("@note", OleDbType.Char, 50);
param2.Value = note;
OleDbParameter param3 = new OleDbParameter("@sol", OleDbType.Char, 360);
param3.Value = sol;
OleDbParameter param4 = new OleDbParameter("@end", OleDbType.Char, 50);
param4.Value = end;
comm.Parameters.Add(param1);
comm.Parameters.Add(param2);
comm.Parameters.Add(param3);
comm.Parameters.Add(param4);


conn.Open();
comm.Prepare();
int rows = comm.ExecuteNonQuery();
conn.Close();
}

Комп заявляет о синтаксической ошибке в запросе в то время как подобная операция(правда для дргой таблицы) вопросов не вызвала:

Код:
    public void AddSolution(string temp,
string name, decimal val)
{
string SQL_String =
"INSERT INTO Problems_Desposition_Table (Name, Desposition, Steps)" +
"VALUES( @name , @temp , @val)";
OleDbCommand comm = new OleDbCommand(SQL_String, conn);
OleDbParameter param1 = new OleDbParameter("@name", OleDbType.Char, 50);
param1.Value = name;
OleDbParameter param2 = new OleDbParameter("@temp", OleDbType.Char, 100);
param2.Value = temp;
OleDbParameter param3 = new OleDbParameter("@val", OleDbType.SmallInt, 0);
param3.Value = val;
comm.Parameters.Add(param1);
comm.Parameters.Add(param2);
comm.Parameters.Add(param3);

conn.Open();
comm.Prepare();
int rows = comm.ExecuteNonQuery();
conn.Close();
}


В чем можетбыть проблема!

P.S: столбец Solution в базе данных имеет тип данных memo (это не может быть причиной!?)

Обсуждение

Неизвестный
05.10.2008, 02:47
общий
это ответ
Здравствуйте, Штыхов Антон Евгеньевич!
Ошибку в минифорум.
Да в этом может быть проблема.
А теперь основные рекмендации вместо OleDbType.Char используйте OleDbType.VarChar
А вообще так писать как вы написали не хорошо. Общие рекомендации. Выполняйте запрос внутри Try Catch.
conn.Open();
comm.Prepare();
int rows = comm.ExecuteNonQuery();

В этом место проверяйте что int => 1. добавьте транзакции если условие не выполнилось делайте RollBack().


Неизвестный
05.10.2008, 08:35
общий
Вовремя выполнения у казывает на comm.Prepare(); Syntax error in INSERT INTO statement.
Неизвестный
05.10.2008, 08:36
общий
удалите эту строку она там не нужна. Должно и без нее работать.
Неизвестный
05.10.2008, 08:37
общий
Тогда во время выполнения если что не так вам вернет ошибку сама БД. И скажет вам что ей не понравилось. После отладки по идее можно вернуть
Неизвестный
05.10.2008, 08:39
общий
ах да и еще
Код:
 
"INSERT INTO Gold_Games_Table (Authors, Note, Solution, EndMessage)" +
"VALUES(@Aht, @note, @sol, @end)";

замените на
Код:
 
"INSERT INTO Gold_Games_Table (Authors, Note, Solution, EndMessage) " +
"VALUES (@Aht, @note, @sol, @end)";

пробелы не помешают.
Неизвестный
05.10.2008, 10:07
общий

убераю comm.Prepare(); но ощибка переходит на слудушую страку!

Но вы правы rows у меня = 0!

Немоглибы вы написать мне исправленый фрагмент кода! Спасибо зарание!
Неизвестный
05.10.2008, 16:14
общий
Написал так:

Код:
string SQL_String =
"INSERT INTO Gold_Games_Table (Authors, Note, Solution, EndMessage)" +
"VALUES (?, ?, ?, ?)";
OleDbCommand comm = new OleDbCommand(SQL_String, conn);
OleDbParameter param1 = new OleDbParameter("@Aht", OleDbType.Char, 50);
param1.Value = Aht;
OleDbParameter param2 = new OleDbParameter("@note", OleDbType.Char, 50);
param2.Value = note;
OleDbParameter param3 = new OleDbParameter("@sol", OleDbType.VarChar, 360);
param3.Value = sol;
OleDbParameter param4 = new OleDbParameter("@end", OleDbType.Char, 50);
param4.Value = end;
comm.Parameters.Add(param1);
comm.Parameters.Add(param2);
comm.Parameters.Add(param3);
comm.Parameters.Add(param4);


try
{
conn.Open();
comm.Prepare();
int rows = comm.ExecuteNonQuery();
}
finally { conn.Close(); }
}


результат тот же!
Неизвестный
05.10.2008, 23:47
общий
а что в Catch пишет добавьте

Сatch (Exception ex)
{
MessageBox.Show(ex.Message)
}

вроде верно написал


попробуйте в качестве теста заменить Memo на String(8000)
Неизвестный
05.10.2008, 23:49
общий
Код:
  finally { conn.Close(); } 


это не верный код
Добавьте проверку isNot = null и после закрывайте
Неизвестный
06.10.2008, 07:05
общий
это ответ
Здравствуйте, Штыхов Антон Евгеньевич!
Конечно желателен полный текст ошибки.
Попробуйте поменять тип для параметра param3 c
OleDbType.Char на OleDbType.WChar так как в поле memo текст сохраняется в Юникод.
А в другом примере передаете param3 decimal в SmallInt . Это тоже ошибка.
Обратите внимание.
Неизвестный
06.10.2008, 08:18
общий
это не верный код
Добавьте проверку isNot = null и после закрывайте


isNot нет такого оператора!
Неизвестный
06.10.2008, 09:49
общий
Попробуйте следующий код
public void AddGame(string Aht, string note, string sol, string end)
{ string SQL_String = "INSERT INTO Gold_Games_Table (Authors, Note, Solution, EndMessage)" +
"VALUES(?, ?, ?, ?)";
OleDbCommand comm = new OleDbCommand(SQL_String, conn);
comm.Parameters.AddRange(new System.Data.OleDb.OleDbParameter[] {
new System.Data.OleDb.OleDbParameter("Authors", System.Data.OleDb.OleDbType.WChar, 50, "Authors"),
new System.Data.OleDb.OleDbParameter("Note", System.Data.OleDb.OleDbType.WChar, 50, "Note"),
new System.Data.OleDb.OleDbParameter("Solution", System.Data.OleDb.OleDbType.WChar, 1024, "Solution"),
new System.Data.OleDb.OleDbParameter("EndMessage", System.Data.OleDb.OleDbType.WChar, 50, "EndMessage")})
comm.Parameters[0].Value = Aht;
comm.Parameters[1].Value = note;
comm.Parameters[2].Value = sol;
comm.Parameters[3].Value = end;
conn.Open();
int rows = comm.ExecuteNonQuery();
conn.Close();
}
Неизвестный
06.10.2008, 14:43
общий
isNot нет такого оператора!
cорри это VB.Net в C# будет !=
Форма ответа