.net - डाटाएडाप्टर डाटाबेस में पंक्तियों को क्यों नहीं डालेंगे?



vb.net sqldataadapter (1)

प्रत्येक RowState अपनी पंक्तियों के RowState को ट्रैक करता है, इसलिए मैन्युअल रूप से एक पाश कार्य में डेटा जोड़ता है क्योंकि वे सभी Added (यह मैन्युअल रूप से DataTable बनाने - इसके पंक्तियों के साथ कुछ नहीं करना है)। जब आप Excel जैसे किसी अन्य स्रोत से लोड करते हैं, तो वे / नये जोड़े नहीं जाते हैं

यदि आप तालिका भरने के लिए DataAdapter का उपयोग करते हैं, तो आप इसे बता सकते हैं कि RowState को अपरिवर्तित करने के लिए सेट करें डेटा डेटा स्टोर से डेटा को माइग्रेट करने के लिए यह बहुत उपयोगी है:

myDA.AcceptChangesDuringFill = False
...
rows = myDA.Fill(xlDT)

इसलिए मेरे पास ऐसी स्थिति है जहां मैं एक SQL Server 2014 डेटाबेस में तालिका में पंक्तियों को सम्मिलित करने के लिए SqlDataAdapter का उपयोग कर रहा हूं।

डेटा का स्रोत एक एक्सेल स्प्रेडशीट है

डाटटेबल ऑब्जेक्ट लूप्स और। कॉलम के लिए कुछ का उपयोग करते हुए आबाद हो जाता है जब डालें ठीक काम करता है। Add and .Rows.Additional शीट से डेटा की प्रतिलिपि बनाने के लिए। यह काम कोड मैं यहाँ शामिल नहीं किया है।

हालांकि, मैं OleDbDataReader का उपयोग करने के लिए कोड को पुनर्रचना कर रहा हूं। यहां मेरा कार्य है:

Private Function FillDataTable(path As String, name As String) As DataTable
        Dim fullpath As String = path
        Dim wsname As String = name
        Dim dt = New DataTable()
        Try
            Dim connectionstring As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" & fullpath & "';Extended Properties= 'Excel 8.0;HDR=Yes;IMEX=1'"
            Dim commandstring As String = "Select * From " & wsname
            Using con As New OleDbConnection(connectionstring)
                Using cmd As New OleDbCommand(commandstring, con)
                    con.Open()
                    Using dr As OleDbDataReader = cmd.ExecuteReader()
                        With dt
                            For Each c In aryFieldList
                                .Columns.Add(c.FieldName, ConvertType(c.DataType))
                            Next

                            .Columns.Add("SubmID")
                            .Columns("SubmID").DefaultValue = 0

                            .Columns.Add("S_ORDER")
                            .Columns("S_ORDER").DefaultValue = 0

                            .Columns.Add("C_ORDER")
                            .Columns("C_ORDER").DefaultValue = 0
                        End With
                        dt.Load(dr)
                    End Using
                End Using
            End Using

        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
        Return dt

    End Function

जब मैं डीबग करता हूं, फ़ंक्शन से लौटा दिया गया डेटाटाले सेट में डेटा होता है, और अन्यथा कोड के पिछले संस्करण से डेटाटाले के समान प्रतीत होता है। यहां कोड है। डेटाबेस को अपडेट करें। यह कोड दोनों मामलों के लिए अपरिवर्तित है

    Dim dt = New DataTable()
    dt = FillDataTable(fullpath, wsname)

Using cn = New SqlConnection(ConfigurationManager.ConnectionStrings("Connection").ConnectionString)
    cn.Open()
    Using adp = New SqlDataAdapter()
        Dim sb As New StringBuilder

        [...StringBuilder code to build the Insert command here...]

        Dim cmd As New SqlCommand(sb.ToString, cn)

        With adp
            .InsertCommand = cmd
            .InsertCommand.Parameters.Add("SubmID", SqlDbType.Int, 1, "SubmID")
            .InsertCommand.Parameters.Add("S_ORDER", SqlDbType.Int, 1, "S_ORDER")
            .InsertCommand.Parameters.Add("C_ORDER", SqlDbType.Int, 1, "C_ORDER")

            For Each p In aryFieldList
                If p.Excluded = False Then
                    .InsertCommand.Parameters.Add(p.FieldName, p.DataType, p.Length, p.FieldName)
                End If
            Next
                adp.Update(dt)

        End With 'adp
    End Using 'adp
End Using 'cn

कोई अपवाद कभी भी फेंक दिया जाता है। Adp.Update (dt) लाइन डिबगिंग में कोई विलंब नहीं है जैसे कि क्वेरी बिल्कुल निष्पादित नहीं है। यह एकमात्र अंतर है जो मैंने पंक्तियों / कॉलमों के बीच नोटिस किया था, जोड़ा गया डीटी और ओलेडीबी ने डीटी बना दिया था - थोड़ी विलंबता समय है क्योंकि डेटा सफलतापूर्वक डाला जाता है

क्या मैं डेटाटेबल की कुछ बुनियादी कार्यक्षमता या प्रॉपर्टी को लापता है या हो सकता है लोड के दौरान विरासत में मिली या बनाई गई संपत्ति? क्या यह कुछ और मैंने सोचा नहीं है? मेरे OleDbReader को डाटाबेस में डाटा क्यों डालें, जब स्रोत एक OleDbReader है जो मैन्युअल रूप से OleDbReader द्वारा भरे OleDbReader दिया गया है?





oledbdatareader