2011-12-20 12 views
2

新しいDataRow(DataSetにローカルに格納されている)をC#でAccessテーブルに挿入しようとしています。テーブルも、このアプリで作成された3列ありさ: C#(OleDB)でオートインクリメントのプライマリキーで新しいDataRowを挿入

  • Name(文字列)
    • IDRequiredが、私はそれを主キーとして設定したもののNoに設定されている整数、主キーを、)
    • Money(int型)

    私の現在のコードは以下のようになります。

     OleDbConnection con = new OleDbConnection(); 
         OleDbCommand cmd = new OleDbCommand(); 
         OleDbDataAdapter da; 
         DataSet ds = new DataSet(); 
         DataView dv = new DataView(); 
         DataRow row; 
    
         string Con = @"Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source="; 
         string path = "V:\\ProjectProgress\\Test.mdb"; 
         con.ConnectionString = Con + path; 
    
         if (con.State == ConnectionState.Closed) 
         { 
          con.Open(); 
         } 
         cmd.Connection = con; 
    
         cmd.CommandText = "SELECT ID, Name, Money FROM Test"; 
         da = new OleDbDataAdapter(cmd); 
         da.TableMappings.Add("Table", "Test"); 
         da.Fill(ds, "Test"); 
    
         ds.Tables["Test"].Columns[0].AutoIncrement = true; 
         ds.Tables["Test"].Columns[0].AutoIncrementSeed = -1; 
         ds.Tables["Test"].Columns[0].AutoIncrementStep = -1; 
    
         dv.Table = ds.Tables["Test"]; 
    
         row = ds.Tables["Test"].NewRow(); 
         row["Name"] = "Huber"; 
         row["Money"] = 100; 
    
         ds.Tables["Test"].Rows.Add(row); 
    
         string strOLE = "INSERT INTO Test ([Name], [Money]) Values(@Name, @Money)"; 
    
         OleDbCommand cmdi = new OleDbCommand(strOLE, con); 
         cmdi.Parameters.Add("@Name", OleDbType.VarChar, 25, "Name"); 
         cmdi.Parameters.Add("@Money", OleDbType.Integer, 4, "Money"); 
    
    
         da.InsertCommand = cmdi; 
    
         da.Update(ds.Tables["Test"]); 
    
         con.Close(); 
    

    私は常にNULL値に

    エラーを含めることはできません

    インデックスまたは主キーを取得しています更新。 YesからID列のRequired値を設定

    インデックスがスローされますか、主キーはNULL値

    エラーを含めることはできません。

    私はAccessに正しいプライマリキーを割り当てさせ、新しい値を自分のデータセットに戻す方法を教えてください。

    SCOPE_IDENTITY()を使用することは、私が知っているいくつかのフォーラムでは、アクセスできません。

    (ビジュアルC#Expressの2010、Access 2003のでの作業)

    答えて

    0

    私が最初に考えたのは、あなたの問題は両方AutoIncrementSeedAutoIncrementStep-1の負の値に設定されていることであるかもしれないということです。両方を正の値に設定してみてください。

    [EDIT]

    第二に考えたのは、あなたがOleDbCommandBuilderMSDN documentation hereを)しようとする場合があります。これは、DataSetの列情報を使用してINSERT、UPDATE、およびDELETEステートメントを自動的に作成します。 以前の雇用主では、Accessで作業するときは常にOleDbCommandBuilderを使用していましたが、自動インクリメントフィールドの場合でも魅力的に機能しました。

    +0

    正シードとステップは何も変更されません - 私はまだ "インデックスまたは主キーがNull値を含むことはできません"エラーを取得します。 私のデータセットからIDを取得するとき(「IDを挿入する([ID]、[名前]、[Money])値(@ ID、@Name、@Money)」)アクセスはこの値をとり、有効なIDなので、主キーがすでに存在する場合はエラーが発生します... – TabulaRasa

    1

    以下は、手順を説明するための完全な動作テストコードです。私たちがやらなければならないことは、主キーと我々は更新したい列を含んOleDbDataAdapter.SelectCommandを提供し、私たちのためにINSERT文を作成しますOleDbCommandBuilderオブジェクト:

    using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 
    using System.Data.OleDb; 
    
    namespace oleDbTest 
    { 
        class Program 
        { 
         static void Main(string[] args) 
         { 
          string myConnectionString; 
          myConnectionString = 
            @"Provider=Microsoft.ACE.OLEDB.12.0;" + 
            @"Data Source=C:\Users\Public\Database1.accdb;"; 
    
          using (OleDbConnection con = new OleDbConnection()) 
          { 
           con.ConnectionString = myConnectionString; 
           con.Open(); 
    
           using (OleDbDataAdapter da = new OleDbDataAdapter()) 
           using (OleDbCommandBuilder bld = new OleDbCommandBuilder(da)) 
           { 
            bld.QuotePrefix = "["; // these are 
            bld.QuoteSuffix = "]"; // important! 
    
            da.SelectCommand = new OleDbCommand(
              "SELECT [ID], [Name], [Money] " + 
              "FROM [Test] " + 
              "WHERE False", 
              con); 
            using (System.Data.DataTable dt = new System.Data.DataTable("Test")) 
            { 
             // create an empty DataTable with the correct structure 
             da.Fill(dt); 
    
             System.Data.DataRow dr = dt.NewRow(); 
             dr["Name"] = "Huber"; 
             dr["Money"] = 100; 
             dt.Rows.Add(dr); 
    
             da.Update(dt); // write new row back to database 
            } 
           } 
           con.Close(); 
          } 
          Console.WriteLine(); 
          Console.WriteLine("Done."); 
         } 
        } 
    } 
    
    関連する問題