11

まず、ストアド プロシージャやビューを使用できません。
これは逆効果に思えるかもしれませんが、それは私のルールではありません。

DataTableデータで満たされた があります。私のSQLテーブルに複製された構造を持っています。

ID - NAME

現在、SQL テーブルには少しのデータがありますが、私のDataTable. ID が一致する場合は SQL テーブルを更新するか、ID が一意であるリストに追加する必要があります。

私のWinFormアプリケーションでのみこれを簡単に行う方法はありますか?

これまでのところ、私は持っています:

SqlConnection sqlConn = new SqlConnection(ConnectionString);
            SqlDataAdapter adapter = new SqlDataAdapter(string.Format("SELECT * FROM {0}", cmboTableOne.SelectedItem), sqlConn);
            using (new SqlCommandBuilder(adapter))
            {
                try
                {
                    adapter.Fill(DtPrimary);
                    sqlConn.Open();
                    adapter.Update(DtPrimary);
                    sqlConn.Close();
                }
                catch (Exception es)
                {
                    MessageBox.Show(es.Message, @"SQL Connection", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
            }

データ表:

        DataTable dtPrimary = new DataTable();

        dtPrimary.Columns.Add("pv_id");
        dtPrimary.Columns.Add("pv_name");

        foreach (KeyValuePair<int, string> valuePair in primaryList)
        {
            DataRow dataRow = dtPrimary.NewRow();

            dataRow["pv_id"] = valuePair.Key;
            dataRow["pv_name"] = valuePair.Value;

            dtPrimary.Rows.Add(dataRow);

SQL:

CREATE TABLE [dbo].[ice_provinces](
    [pv_id] [int] IDENTITY(1,1) NOT NULL,
    [pv_name] [nvarchar](50) NOT NULL,
 CONSTRAINT [PK_ice_provinces] PRIMARY KEY CLUSTERED 
(
    [pv_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
4

2 に答える 2

3

とにかくすべてのデータを持つデータテーブルから既存の値を更新して新しい値を挿入するので、次のアプローチが最適だと思います。

  1. SQL テーブルからすべての既存のデータを削除します (速度と効率のために TSQL TRUNCATEステートメントを使用できます)。
  2. ADO.NETクラスを使用して、 WriteToServerメソッドSqlBulcCopyを使用して ADO.NET テーブルから SQL テーブルにデータを一括挿入します。

ビューやストアド プロシージャは関係なく、純粋な TSQL と .NET コードだけです。

于 2013-07-23T15:16:01.853 に答える
0

これは私の試みであり、少なくともデータベース内のレコードを更新することができました。Fill() が実行された後に DataTable に値を適用するという点で、これまでのソリューションとは異なります。更新する必要があるレコードがある場合は、DataTable を手動で検索する必要があります。これが欠点です。もう 1 つのことは、MissingSchemaAction を適切に設定していない場合、DataTable がデータベースからテーブル スキーマを継承しないことに気付きました。

コード例 (完全な ConsoleApplication) は次のとおりです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;

namespace SQLCommandBuilder
{
    class Program
    {
        static void Main(string[] args)
        {
            SqlConnectionStringBuilder ConnStringBuilder = new SqlConnectionStringBuilder();
            ConnStringBuilder.DataSource = @"(local)\SQLEXPRESS";
            ConnStringBuilder.InitialCatalog = "TestUndSpiel";
            ConnStringBuilder.IntegratedSecurity = true;

            SqlConnection sqlConn = new SqlConnection(ConnStringBuilder.ConnectionString);

            SqlDataAdapter adapter = new SqlDataAdapter(string.Format("SELECT * FROM {0}", "ice_provinces"), sqlConn);
            adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;   // needs to be set to apply table schema from db to datatable

            using (new SqlCommandBuilder(adapter))
            {
                try
                {
                    DataTable dtPrimary = new DataTable();                                   

                    adapter.Fill(dtPrimary);

                    // this would be a record you identified as to update:
                    dtPrimary.Rows[1]["pv_name"] = "value";

                    sqlConn.Open();
                    adapter.Update(dtPrimary);
                    sqlConn.Close();
                }
                catch (Exception es)
                {
                    Console.WriteLine(es.Message);
                    Console.Read();
                }
            }
        }
    }
}
于 2013-07-24T11:20:04.233 に答える