2013-07-23 37 views
7

Thứ nhất, tôi không thể sử dụng bất kỳ thủ tục hoặc chế độ xem được lưu trữ nào.
Tôi biết điều này có vẻ phản tác dụng, nhưng đó không phải là quy tắc của tôi.Chèn hoặc Cập nhật Bảng SQL với DataTable

Tôi có DataTable, đầy dữ liệu. Nó có một cấu trúc được sao chép vào bảng SQL của tôi.

ID - NAME

Bảng SQL hiện đang có một chút dữ liệu, nhưng tôi cần đến nay cập nhật nó với tất cả các dữ liệu của DataTable tôi. Nó cần phải UPDATE Bảng SQl nếu so khớp ID, hoặc ADD vào danh sách mà nó là duy nhất.

Có cách nào đơn giản chỉ thực hiện việc này trong ứng dụng WinForm của tôi không?

Cho đến nay, tôi có:

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:

 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] 
+0

mã hiện tại của bạn nên làm các trick. Nó có lỗi với lỗi hay không âm thầm? Đây có phải là ASP.NET không? – Renan

+0

Bạn có thể sử dụng LINQ không? – user1477388

+0

@Renan, hiện tại, chỉ cần thêm các giá trị vào cuối bảng trước đó. - Có, tôi có thể sử dụng linq – TheGeekZn

Trả lời

3

Kể từ khi bạn đang đi cập nhật các giá trị hiện có và chèn những cái mới từ DataTable mà có tất cả các dữ liệu anyway tôi nghĩ rằng cách tiếp cận sau đây có thể làm việc tốt nhất cho bạn:

  1. Xóa tất cả dữ liệu hiện có từ Bảng SQL (bạn có thể sử dụng TSQL TRUNCATE tuyên bố cho tốc độ và hiệu quả
  2. Sử dụng lớp ADO.NET SqlBulcCopy số liệu số lượng lớn chèn từ bảng ADO.NET để bảng SQL sử dụng WriteToServer phương pháp.

Không có chế độ xem hoặc thủ tục lưu trữ nào có liên quan, chỉ TSQL thuần túy và mã .NET.

+0

Dễ dàng lập trình nhưng có thể không mở rộng rất tốt. Nếu không có quá nhiều hồ sơ, điều này sẽ hoạt động tốt. –

+1

@MichaelTodd đúng, nhưng tôi tin rằng kết hợp sao chép TRUNCATE/Bulk nên giữ vững cho hàng trăm nghìn bản ghi. Nhưng nó thậm chí không nên đến điều này kể từ khi OP giữ tất cả dữ liệu trong DataTable trong bộ nhớ và (hy vọng) mà không nên nhiều. –

+0

Đó là một giải pháp cưỡng bức rất không phù hợp. – Renan

0

Đây là thử của tôi về điều này, theo đó tôi đã có thể cập nhật ít nhất các bản ghi trong cơ sở dữ liệu. Nó khác với giải pháp của bạn cho đến nay, rằng nó áp dụng các giá trị cho DataTable sau khi Fill() đã được thực hiện. Bạn sẽ phải tìm kiếm thủ công trong DataTable nếu có các bản ghi bạn phải cập nhật, đó là nhược điểm. Một điều nữa là tôi nhận ra rằng DataTable không kế thừa lược đồ bảng từ cơ sở dữ liệu, nếu bạn chưa đặt MissingSchemaAction đúng cách.

Vì vậy, đây là mã ví dụ (hoàn 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(); 
       } 
      } 
     } 
    } 
} 
Các vấn đề liên quan