C # Как подключиться к MS Access 2007 - PullRequest
5 голосов
/ 03 февраля 2009

У меня проблема с подключением к моей MS Access DB 2007. Код:

private void btnSave_Click(object sender, EventArgs e)
    {
        OleDbConnection Conn = new OleDbConnection();

        try
        {
            string conn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+ Directory.GetCurrentDirectory() +"\\dvd_manager.accdb;Persist Security Info=False;";
            Conn.ConnectionString = conn;

            Conn.Open();

            int i = cbbLocatie.SelectedIndex + 65;
            char c = (char)i;

            string sql = "INSERT INTO DVD (titel, locatie)VALUES(@titel, @locatie)";
            OleDbCommand Com = new OleDbCommand();
            Com.CommandText = sql;
            Com.Connection = Conn;

            OleDbParameter Param = new OleDbParameter("@titel", txtTitle.Text);
            Com.Parameters.Add(Param);

            Param = new OleDbParameter("@locatie", c);
            Com.Parameters.Add(Param);

            Com.ExecuteNonQuery();
            Conn.Close();

            MessageBox.Show("Data is opgeslagen " + sql);
        }
        catch (Exception ex)
        {
            MessageBox.Show("Fout opgetreden: " + ex.Message);
        }
        finally
        {
            Conn.Close();
        }
    }

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

Thnx

Edit: Возвращаемое значение ExecuteNonQuery () равно 1 (я редактирую свой пост, потому что я не могу добавлять комментарии, когда я нажимаю добавить комментарий, окно не отображается ..)

Редактировать 2: Я создал класс со свойствами Title и Location. Код: private void btnSave_Click (отправитель объекта, EventArgs e) { OleDbConnection Conn = new OleDbConnection ();

try
{
    string conn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+ Directory.GetCurrentDirectory() +"\\dvd_manager.accdb;Persist Security Info=False;";
    Conn.ConnectionString = conn;

    // Create object
    Medium M = new Medium();
    int i = cbbLocatie.SelectedIndex + 65;
    char c = (char)i;

    M.Location = c;
    M.Title = txtTitle.Text;

    Conn.Open();

    string sql = "INSERT INTO DVD (titel, locatie)VALUES(@titel, @locatie)";
    OleDbCommand Com = new OleDbCommand();
    Com.CommandText = sql;
    Com.Connection = Conn;

    OleDbParameter Param1 = new OleDbParameter("@titel", M.Title);
    Com.Parameters.Add(Param1);

    OleDbParameter Param2 = new OleDbParameter("@locatie", M.Location);
    Com.Parameters.Add(Param2);

    int ret = Com.ExecuteNonQuery();
    Conn.Close();

    MessageBox.Show("Data is opgeslagen " + ret);
}
catch (OleDbException ex)
{
    MessageBox.Show(ex.Message);
}
catch (Exception ex)
{
    MessageBox.Show("Fout opgetreden: " + ex.Message);
}
finally
{
    Conn.Close();
}

}

Так как я все еще не могу нажать на кнопку добавления комментария, вот мой новый код с безымянными параметрами sql:

// some code
Conn.Open();

string sql = "INSERT INTO DVD (titel, locatie)VALUES(?, ?)";
OleDbCommand Com = new OleDbCommand();
Com.CommandText = sql;
Com.Connection = Conn;

OleDbParameter Param1 = new OleDbParameter("@p1", OleDbType.VarChar, 1);
Param1.Value = M.Title;
Com.Parameters.Add(Param1);

OleDbParameter Param2 = new OleDbParameter("@p2", OleDbType.VarChar, 255);
Param2.Value = M.Location;
Com.Parameters.Add(Param2);

int ret = Com.ExecuteNonQuery();
Conn.Close();
// morde code

Ответы [ 3 ]

1 голос
/ 03 февраля 2009

Насколько мне известно, вы не можете использовать именованные параметры с OleDbParameter.

Ваша вставка должна выглядеть так:

string sql = "INSERT INTO DVD (titel, locatie)VALUES(?, ?)";

И затем вы должны добавить OleDbParameters в правильном порядке. Имена не используются.

http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbparameter.aspx

Edit:

Непроверенный код ниже, но вот пример того, как я бы это сделал.

using(OleDbConnection connection = new OleDbConnection(CONNECTION_STRING))
{
  using(OleDbCommand command = connection.CreateCommand())
  {
    command.CommandType = CommandType.Text;
    command.CommandText = "INSERT INTO DVD(title,locatie)VALUES(?,?)";
    command.Parameters.Add("@p1", OleDbType.VarChar, 1).Value = M.Title;
    command.Parameters.Add("@p2", OleDbType.VarChar, 255).Value = M.Location;

    connection.Open();
    int ret = command.ExecuteNonQuery();
  }
}
1 голос
/ 03 февраля 2009

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

0 голосов
/ 02 февраля 2010

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

public void setParameter(String paramAT, String paramTxt)
{
    OleDbCommand myCommand;
    DbParameter parameter = myCommand.CreateParameter();
    parameter.ParameterName = paramAT;
    parameter.Value = paramTxt;
    myCommand.Parameters.Add(parameter);
}

public int CreateDVD()
{
    try
    {
        string strSqldvd = "INSERT INTO DVD(title,locatie)VALUES(@title,@locate?)";

        myCommand = (OleDbCommand)dbconn.MyProvider.CreateCommand();
        dbconn.MyConnection.Open();
        myCommand.Connection = dbconn.MyConnection;
        myCommand.CommandText = strSqldvd;
        setParameter("@title",M.Title );
        setParameter("@locate", M.Location);
    }
    catch (Exception)
    {
        throw new ArgumentException();
    }

    int count = myCommand.ExecuteNonQuery();
    dbconn.MyConnection.Close();
    return count;
}

Это как просто. Я вставляю и продолжаю использовать этот метод параметров в своем обновлении и вставляю и т.д. .... Надеюсь, это поможет.

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