2016-11-16 2 views
0

私は約3-4ヶ月間C#をコーディングしていると言って始めましょう。WPFを使用してAccess MDBファイルに接続する(ConnectionStringプロパティが初期化されていない)

私は、Visual Studio内でどのようにデータベースにアクセスしてデータを挿入、更新、削除できるのかを基本的に理解しようとしています。私はさまざまなテストを試みましたが、私はOleDbがあまり好きではないWPFについて何かがあるという結論に達したと思います。 2つの同一のプロジェクトを作成しました.1つはWindowsフォームを使用し、もう1つはWPFを使用します。 Windowsは、プロジェクトのバージョンは

私はこの問題を解決する方法が分からないしかし、WPFのプロジェクトは、私にエラー

を与える「のConnectionStringプロパティが初期化されていない」しません絶対に正常に動作しますフォーム。私は12時間の最高の部分のためにインターネットを精練していましたが、まだ全く成功しませんでした。

ここにWPFファイルのオリジナルコードがあります。これはWindowsのフォームコードと同じです

public partial class MainWindow : Window 
{ 

    OleDbCommand cmd = new OleDbCommand(); 
    OleDbConnection cn = new OleDbConnection(); 
    OleDbDataReader dr; 

    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 

     cn.ConnectionString = @"Provider = Microsoft.Jet.OLEDB.4.0; Data Source = C:\Users\MarkB\Documents\testing.mdb"; 
     cmd.Connection = cn; 
     loaddata(); 
    } 
    private void loaddata() 
    { 
     listBox1.Items.Clear(); 
     listBox2.Items.Clear(); 
     listBox3.Items.Clear(); 
     listBox4.Items.Clear(); 
     try 
     { 
      string q = "select * from info"; 
      cmd.CommandText = q; 
      cn.Open(); 
      dr = cmd.ExecuteReader(); 
      if(dr.HasRows) 
      { 
       while(dr.Read()) 
       { 
        listBox1.Items.Add(dr[0].ToString()); 
        listBox2.Items.Add(dr[1].ToString()); 
        listBox3.Items.Add(dr[2].ToString()); 
        listBox4.Items.Add(dr[3].ToString()); 
       } 
      } 
      dr.Close(); 
      cn.Close(); 
     } 
     catch(Exception e) 
     { 
      cn.Close(); 
      MessageBox.Show(e.Message.ToString()); 
     } 
    } 

    private void listBox2_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     ListBox l = sender as ListBox; 
     if(l.SelectedIndex != -1) 
     { 
      listBox1.SelectedIndex = l.SelectedIndex; 
      listBox2.SelectedIndex = l.SelectedIndex; 
      listBox3.SelectedIndex = l.SelectedIndex; 
      listBox4.SelectedIndex = l.SelectedIndex; 
     } 

    } 

    private void button1_Click(object sender, EventArgs e) 
    { 

     if ((textBox1.Text!="") && (textBox2.Text!="")) 
     { 
      string q ="insert into info (firstname,surname,address) values ('" + textBox1.Text + "','" + textBox2.Text + "','" + textBox3.Text +"')"; 
      dosomething(q); 
      textBox1.Text = null; 
      textBox2.Text = null; 
      textBox3.Text = null; 
     } 
    } 

    private void dosomething(String q) 
    { 
     try 
     { 
      cn.Open(); 
      cmd.CommandText = q; 
      cmd.ExecuteNonQuery(); 
      MessageBox.Show("Data Saved"); 
      cn.Close(); 
      loaddata(); 
     } 
     catch (Exception e) 
     { 
      cn.Close(); 
      MessageBox.Show(e.Message.ToString()); 
     } 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     if(listBox1.SelectedIndex !=-1) 
      { 
      string q = "delete from info where id =" + listBox1.SelectedItem.ToString(); 
      dosomething(q); 
     } 
    } 
} 

誰でも助けてくれれば幸いです。私は問題がコードの接続面から生じる必要があることを知っています

+0

UIフレームワークはデータベースフレームワークとほとんど関係がありません。だからあなたの質問にそれらを混ぜる理由は? –

+0

@LeiYang何らかの理由でUIを選択すると、データベースに接続できるコードが混乱するためです。あなた自身でテストし、シンプルなWPFとWindowsフォームアプリケーションを作成し、このコードをテストしてください。 1つは動作し(Windowsフォーム)、もう1つは失われます(WPF)。 私はプログラムを設計するときにWPFを使うことを好むので、この問題の最下部に行きたいと思っています。 –

+0

WPFを使用しているのであれば、なぜあなたが混在しているのかわからないのですが、なぜ**バインディングとMVVM **を使用しないのですか? –

答えて

0

エラーは、接続文字列が渡される前に接続が呼び出されていることを示唆しています。たぶん、右あなたが最初のOleDbConnectionオブジェクトをインスタンス上部に接続文字列を設定してみてください:

OleDbConnection cn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\\Users\\MarkB\\Documents\\testing.mdb"); 

次に、新しいcmdが毎回オブジェクトを作成するには、(むしろ一度上部に比べて)それを必要とする:

string query = "select * from somethingorother"; 
OleDbCommand cmd = new OleDbCommand(query, cn); 
関連する問題