Ошибка с динамически созданным оператором вставки SQL - PullRequest
0 голосов
/ 14 февраля 2011

Могу ли я знать, что не так с моим утверждением? Я получаю синтаксическую ошибку. Пытаюсь выяснить, что не так весь день. (

cmd.CommandText = "INSERT INTO LogIn(Username,Password) VALUES('" + AddUsernameTextBox.Text + "','" + AddPasswordTextBox.Text + "')";

Ответы [ 9 ]

3 голосов
/ 14 февраля 2011
cmd.CommandText = "INSERT INTO LogIn([Username],[Password]) VALUES('" + AddUsernameTextBox.Text + "','" + AddPasswordTextBox.Text + "')";

Этот код поможет, если ошибка вызвана зарезервированными ключевыми словами: - имя пользователя и пароль. Пожалуйста, укажите ошибку, если это не так.

2 голосов
/ 14 февраля 2011
  command.CommandText = "INSERT INTO Login([Username],[Password]) VALUES(@Username, @Password)";

  //Not sure how you create your commands in your project
  //here I'm using the ProviderFactory to create instances of provider specific DbCommands.

  var parameter = dbProviderFactory.CreateParameter();
  parameter.DbType = System.Data.DbType.String;
  parameter.ParameterName = "@Username";
  parameter.Value = AddUsernameTextBox.Text;
  command.Parameters.Add(parameter);

  parameter = dbProviderFactory.CreateParameter();
  parameter.DbType = System.Data.DbType.String;
  parameter.ParameterName = "@Password";
  parameter.Value = AddPasswordTextBox.Text;
  command.Parameters.Add(parameter);

Ниже приведен более полный пример кода использования ConnectionStringSettings, DbProviderFactory и т. Д. Это не решит вашу проблему, но это способ доступа к данным, если вы используете ядро ​​ADO.NET, как вы, кажется, делаете в вашем образце.

  ConnectionStringSettings connectionStringSettings = ConfigurationManager.ConnectionStrings["SomeConnectionName"];
  if (connectionStringSettings == null)
    throw new Exception("Application config file does not contain a connectionStrings section with a connection called \"SomeConnectionName\"");
  DbProviderFactory dbProviderFactory = DbProviderFactories.GetFactory(connectionStringSettings.ProviderName);
  using (var dbConnection = dbProviderFactory.CreateConnection())
  {
    dbConnection.ConnectionString = connectionStringSettings.ConnectionString;
    dbConnection.Open();
    using (var command = dbConnection.CreateCommand())
    {
      command.CommandText = "INSERT INTO Login([Username],[Password]) VALUES(@Username, @Password)";

      var parameter = dbProviderFactory.CreateParameter();
      parameter.DbType = System.Data.DbType.String;
      parameter.ParameterName = "@Username";
      parameter.Value = AddUsernameTextBox.Text;
      command.Parameters.Add(parameter);

      parameter = dbProviderFactory.CreateParameter();
      parameter.DbType = System.Data.DbType.String;
      parameter.ParameterName = "@Password";
      parameter.Value = AddPasswordTextBox.Text;
      command.Parameters.Add(parameter);

      var dbTransaction = dbConnection.BeginTransaction();
      try
      {
        command.ExecuteNonQuery();
        dbTransaction.Commit();
      }
      catch (Exception)
      {
        dbTransaction.Rollback();
        throw;
      }
    }
  }

Файл app.Config, на который опирается приведенный выше код, будет выглядеть следующим образом. Конечно, в этом контексте важен только раздел connectionStrings в файле конфигурации

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings>
    <add name="SomeConnectionName" providerName="System.Data.OleDb" connectionString="Your Provider Specific Connection String" />
  </connectionStrings>
</configuration>
1 голос
/ 14 февраля 2011

Лучший способ - использовать параметры: '@' Таким образом, ваш код будет выглядеть намного понятнее и понятнее. И делает ваше приложение более безопасным.

попробуйте этот код:

            using (var con = new OleDbConnection(_constring))
            {
                con.Open();
                using (
                    var cmd =
                        new OleDbCommand(
"UPDATE LogIn SET Username=@Username, Password=@Password WHERE (ID = @Id)",
                            con))
                {
                    try
                    {

                        cmd.Parameters.AddWithValue("@Username",EditUsernameTextBox.Text);
                        cmd.Parameters.AddWithValue("@Password",EditPasswordTextBox.Text);
                        cmd.Parameters.AddWithValue("@Id",IDTextBox.Text);


                        cmd.ExecuteNonQuery();
                    }
                    catch (Exception ex)
                    {
                        throw;
                    }
                    finally
                    {
                        con.Close();
                    }

                }

Привет! * * 1006

1 голос
/ 14 февраля 2011

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

cmd.CommandText = "INSERT INTO Вход в систему (имя пользователя, пароль) VALUES ('" + AddUsernameTextBox.Text.Replace ("'"), "'" ") +"', '"+ AddPasswordTextBox.Text.Replace ("' "," '' ") +" '); ";

Это, конечно, только 100% лучше использовать параметризованные запросы;от вас другие вопросы это C # / Visual Studio против MS Access через OLE / Jet?

0 голосов
/ 14 февраля 2011

Есть ли у значений EditUsernameTextBox.Text или EditPasswordTextBox.Text сами кавычки? Это запутает SQL.

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

И распечатали ли вы заявление, чтобы увидеть, как оно выглядит, как было запрошено ...?

0 голосов
/ 14 февраля 2011

Вы пропустили пару апострофов, если ваш идентификатор не числовой:

WHERE (ID ='" + IDTextBox.Text + "')";
0 голосов
/ 14 февраля 2011

Проверьте, работает ли это.Вы пропустили одинарные кавычки для значения в своем выражении WHERE:

"UPDATE
    LogIn
SET
    Username = '" + EditUsernameTextBox.Text + "'
    ,Password = '" + EditPasswordTextBox.Text + "'
WHERE
    (ID = '" + IDTextBox.Text + "')";

Плюс, убедитесь, что, как упоминал Даниэль Уайт, вы позаботились о любом SQL-внедрении.

0 голосов
/ 14 февраля 2011

Скорее всего, значение в IDTextBox.text не является числовым ...

Но, как указывает Дэниел, это очень уязвимо для SQL-инъекций.

Что бы произошло, если бы я набрал:

' ; DROP TABLE login

в поле EditUserNameTextBox

0 голосов
/ 14 февраля 2011

Является ли столбец ID целым числом?Если нет, вам также нужно заключить значения в одинарные кавычки.Также попробуйте убрать скобки.

...