2012-03-31 147 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