2012-03-31 150 views
0

我有一個VB.Net應用程序,該應用程序應該允許用戶將CSV文件導入到數據網格中(然後將它),然後將這些行更新到Oracle中的表格。Vb.Net和CSV文件

這是我到目前爲止,但它似乎並沒有工作既不拋出一個錯誤。

Private Sub Update_Click(ByVal sender As System.Object, ByVal e As 
    System.EventArgs) Handles Update.Click 

    MsgBox("Saving...") 

    Dim table As New DataTable() 
    Dim BindingSource As New BindingSource() 
    BindingSource.DataSource = table 


    table.Columns.Add("ORDER_NO") 
    table.Columns.Add("LINE_ITEM_NO") 
    table.Columns.Add("CONTRACT") 
    table.Columns.Add("PART_NO") 
    table.Columns.Add("QTY_REQUIRED") 
    table.Columns.Add("QTY_PER_ASSEMBLY") 
    table.Columns.Add("RELEASE_NO") 
    table.Columns.Add("SEQUENCE_NO") 
    table.Columns.Add("ORDER_CODE") 
    table.Columns.Add("PART_OWNERSHIP") 

    Dim parser As New FileIO.TextFieldParser("C:\Documents and Settings\User\Desktop\solution.csv") 

    parser.Delimiters = New String() {","} ' fields are separated by comma 
    parser.HasFieldsEnclosedInQuotes = True 
    parser.TrimWhiteSpace = True 


    parser.ReadLine() 



Dim sConnectionString As String = "Data 
Source=MYSERVER.COM;User ID=MYNAME;Password=MYPASSWD;" 

Dim strSql As String = "INSERT INTO SHOP_MATERIAL_ALLOC_TAB(ORDER_NO, 
LINE_ITEM_NO, CONTRACT, PART_NO, QTY_REQUIRED, QTY_PER_ASSEMBLY, 
RELEASE_NO,SEQUENCE_NO,ORDER_CODE,PART_OWNERSHIP) VALUES (@ORDER_NO, 
@LINE_ITEM_NO,@CONTRACT,@PART_NO,@QTY_REQUIRED,@QTY_PER_ASSEMBLY,@RELEASE_NO,@SEQUENCE_NO,@ORDER_CODE,@PART_OWNERSHIP)" 


    Using conn As New OracleClient.OracleConnection(sConnectionString) 

     Dim adapter As New OracleDataAdapter 
     Dim cmd As New OracleClient.OracleCommand() 
     cmd.Connection = conn 

     cmd.Connection.Open() 
     cmd.CommandText = strSql 
     adapter.InsertCommand = New OracleCommand(strSql, conn) 
     adapter.UpdateCommand = cmd 
     adapter.Update(table) 

     '--cmd.ExecuteReader() 
     cmd.Connection.Close() 

     MsgBox("Saved! Kindly check your Shop order!") 
     DataGridView1.DataSource = Nothing 





    End Using 

End Sub 

現在,我已經把它歸結爲在表中插入記錄,但問題是,它只能通過解析該行的第一列。 因此,所有假設表中的6列都使用CSV中第一個字段的值進行更新。

MsgBox("Saving...") 


    Dim parser As New FileIO.TextFieldParser("C:\Documents and Settings\nUser\Desktop\solution.csv") 

    parser.Delimiters = New String() {","} ' fields are separated by comma 
    parser.HasFieldsEnclosedInQuotes = True 
    parser.TrimWhiteSpace = True 

    Dim i As Integer 

    For i = 0 To DataGridView1.RowCount - 1 


     Dim CurrentField = parser.ReadFields() 
     '--parser.ReadLine() 

Dim sConnectionString As String = "Data Source=MYSERVER.COM;User ID=MYUSER;Password=MYPASSWD;" 

Dim strSql As String = "INSERT INTO SHOP_MATERIAL_ALLOCT(ORDER_NO, LINE_ITEM_NO, CONTRACT, PART_NO, QTY_REQUIRED, QTY_PER_ASSEMBLY) VALUES (:ORDER_NO,   :LINE_ITEM_NO,:CONTRACT,:PART_NO,:QTY_REQUIRED,:QTY_PER_ASSEMBLY)" 




     Using conn As New OracleClient.OracleConnection(sConnectionString) 
      Using cmd As New OracleClient.OracleCommand() 


       Dim adapter As New OracleDataAdapter 
       conn.Open() 
       cmd.Connection = conn 
       cmd.CommandText = strSql 
       cmd.Parameters.AddWithValue("ORDER_NO", CurrentField(i)) 
       cmd.Parameters.AddWithValue("LINE_ITEM_NO", CurrentField(i)) 
       cmd.Parameters.AddWithValue("CONTRACT", CurrentField(i)) 
       cmd.Parameters.AddWithValue("PART_NO", CurrentField(i)) 
       cmd.Parameters.AddWithValue("QTY_REQUIRED", CurrentField(i)) 
       cmd.Parameters.AddWithValue("QTY_PER_ASSEMBLY", CurrentField(i)) 



       cmd.CommandText = strSql 
       adapter.InsertCommand = New OracleCommand(strSql, conn) 
       adapter.UpdateCommand = cmd 
       'adapter.Update(table) 
       cmd.ExecuteNonQuery() 
       cmd.Connection.Close() 

       DataGridView1.DataSource = Nothing 
      End Using 
     End Using 
    Next 

回答

0

從來沒有使用甲骨文,所以請忽略我,如果我是愚蠢的。您是否試過conn.Connect()而不是cmd.Connection.Open()

0

我不明白創建DataTable並添加列的代碼部分。
它沒有在任何地方使用,因此與您的問題無關。
讓我們來看看相關的代碼數據連接

' If I remember well, the parameters in an oracle statement are prefixed by a ":" 
Dim strSql As String = "INSERT INTO SHOP_MATERIAL_ALLOC_TAB(ORDER_NO," + 
         "LINE_ITEM_NO, CONTRACT, PART_NO, QTY_REQUIRED, QTY_PER_ASSEMBLY, " + 
         "RELEASE_NO,SEQUENCE_NO,ORDER_CODE,PART_OWNERSHIP) VALUES (:ORDER_NO, " + 
         ":LINE_ITEM_NO,:CONTRACT,:PART_NO,:QTY_REQUIRED,:QTY_PER_ASSEMBLY, " + 
         ":RELEASE_NO,:SEQUENCE_NO,:ORDER_CODE,:PART_OWNERSHIP)" 

' Connection and Command are Disposable, so use `Using` around them 
Using conn As New OracleClient.OracleConnection(sConnectionString) 
Using cmd As New OracleClient.OracleCommand() 

    Dim adapter As New OracleDataAdapter 
    conn.Open() 
    cmd.Connection = conn 
    cmd.CommandText = strSql 
    ' Now you need to add the parameters to your command 
    ' One parameter for each column used in the insert statement 
    ' I suppose that values for the paramenter are in the current line from your CSV 
    cmd.Parameters.Add("ORDER_NO", OracleType.VarChar).Value = parser[index_of_orderNumber_Text]) 
    ' .... other parameters to be added.... 
    ' Now you can execute the INSERT statement directly with your command 
    cmd.ExecuteNonQuery() 
End Using 

而且,隨着最後一件事,在OracleClient的命名空間已被微軟棄用,因此,你應該嘗試與ODP直接從甲骨文取代。

+0

感謝您指出我的錯誤史蒂夫。我糾正了一樣,但它給了我一個警告。添加被棄用和過時,並給我建議使用AddWithValue,而不是我所做的 - cmd.Parameters.AddWithValue(「ORDER_NO」,parser [0]),但它拋出一個錯誤「預計標識符」並指向索引值的提供位置。沒有太多的文件,請指導我。 – user1305070 2012-04-01 08:41:14

+0

對不起,我在我的例子中犯了一個錯誤。 'cmd.Parameters.Add(「ORDER_NO」,OracleType.VarChar).Value = parser [0];'對於AddWithValue,我不能說。它應該像你寫的那樣工作。嘗試舊方法(更正) – Steve 2012-04-01 08:55:45

+0

這是[MSDN鏈接](http://msdn.microsoft.com/en-us/library/system.data.oracleclient.oracleparametercollection.addwithvalue(v = vs.100).aspx )到Microsoft的OracleClient文檔。 – Steve 2012-04-01 09:01:08