2013-07-23 9 views
7

के साथ SQL तालिका डालें या अपडेट करें सबसे पहले, मैं किसी संग्रहीत प्रक्रियाओं या विचारों का उपयोग नहीं कर सकता।
मुझे पता है कि यह काउंटर-उत्पादक प्रतीत हो सकता है, लेकिन वे मेरे नियम नहीं हैं।डेटाटेबल

मेरे पास DataTable है, जो डेटा से भरा हुआ है। इसमें मेरी एसक्यूएल तालिका में एक प्रतिकृति संरचना है।

ID - NAME

एसक्यूएल तालिका वर्तमान में डेटा का एक सा है, लेकिन अब मैं अपने DataTable के सभी डेटा के साथ अद्यतन करने की आवश्यकता। आईडी के मैच में एसक्यूएल टेबल को अपडेट करने की जरूरत है, या उस सूची में जोड़ें जहां यह अद्वितीय है।

क्या यह केवल मेरे 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:

 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); 

एसक्यूएल:

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

आपके मौजूदा कोड चाल करना चाहिए:

तो यहाँ उदाहरण कोड (पूरा ConsoleApplication) है। क्या यह किसी त्रुटि के साथ असफल रहा है, या चुपचाप विफल रहा है? क्या यह एएसपी.नेट है? – Renan

+0

क्या आप LINQ का उपयोग कर सकते हैं? – user1477388

+0

@ रेनान, वर्तमान में यह पिछले तालिका के अंत में मूल्य जोड़ रहा है। - हाँ, मैं LINQ – TheGeekZn

उत्तर

3

आप अद्यतन मौजूदा मूल्यों जा रहा है और कि datatable से नए लोगों को सम्मिलित कर रहे हैं के बाद से मेरे पास सभी डेटा हैं, मुझे लगता है कि निम्न दृष्टिकोण आपके लिए सबसे अच्छा काम कर सकता है:

  1. एसक्यूएल तालिका से सभी मौजूदा डेटा हटाएं (आप WriteToServer विधि का उपयोग एसक्यूएल मेज पर ADO.NET मेज से थोक डालने के आंकड़ों के गति और दक्षता
  2. उपयोग ADO.NET SqlBulcCopy वर्ग के लिए TSQL TRUNCATE कथन का उपयोग कर सकते हैं।

कोई भी दृश्य या संग्रहित प्रक्रियाओं शामिल है, सिर्फ शुद्ध TSQL और .NET कोड।

+0

प्रोग्राम के लिए आसान है लेकिन बहुत अच्छी तरह से स्केल नहीं हो सकता है। यदि कभी भी बहुत सारे रिकॉर्ड नहीं हैं, तो यह ठीक काम करना चाहिए। –

+1

@MichaelTodd सच है, लेकिन मैं ट्रेलकेट/थोक कॉपी संयोजन को सैकड़ों हजारों रिकॉर्ड के लिए अच्छी तरह से पकड़ना चाहिए। लेकिन यह तब तक नहीं आना चाहिए क्योंकि ओपी सभी डेटा इन-मेमोरी डेटाटेबल में रखता है और (उम्मीद है कि) ज्यादा नहीं होना चाहिए। –

+0

यह एक बहुत ही सुरुचिपूर्ण, ब्रूट फोर्सिंग समाधान है। – Renan

0

यह मेरी कोशिश है, जिसके द्वारा मैं डेटाबेस में रिकॉर्ड्स को कम से कम अद्यतन करने में सक्षम था। यह अब तक आपके समाधान से अलग है, यह भरने() को निष्पादित करने के बाद डेटाटेबल को मान लागू करता है। अगर आपको अपडेट करना है तो आपको डेटाटेबल में मैन्युअल रूप से खोजना होगा, यह कमी है। एक और बात यह है कि, मुझे एहसास हुआ कि डेटाटेबल डेटाबेस से टेबल स्कीमा का वारिस नहीं करता है, अगर आपने MissingSchemaAction को ठीक से सेट नहीं किया है।

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(); 
       } 
      } 
     } 
    } 
}