繁体   English   中英

F#SqlCommand动态写入SQL表

[英]F# SqlCommand dynamically write to SQL table

因此,我试图从一个表(表1)中获取数据,然后将所选数据写入第二个表(表2)中。 我可以从table1中获取数据,然后选择所需的数据。 我在将其写入table2时遇到问题。

这是我目前所拥有的:

let insertData(data: string []List) =

    let tableName = data.Item(0).GetValue(0).ToString() //Gets the table Name
    let columnTypes = GetDevTableColumnsTypes tableName

    let mutable tableDataTemp = List.empty
    for i = 0 to data.Length-1 do
        let mutable rowDataTemp = List.empty

        for j = 0 to data.Item(i).Length-1 do
            if data.Item(i).GetValue(j).Equals(tableName) then //if statement removes table name from string array.
                System.Diagnostics.Debug.WriteLine("tableName removed from data")
            else
                let cellData = data.Item(i).GetValue(j)

                rowDataTemp <- cellData :: rowDataTemp

        let rowData = rowDataTemp |> List.toArray |> Array.rev
        tableDataTemp <- rowData :: tableDataTemp

    let tableData = tableDataTemp |> List.toArray |> Array.rev //Probably unneeded

    let cn = new SqlConnection(Settings.Azure.SQL.CCSettingDev)
    cn.Open()
    let sQL = "INSERT INTO [" + tableName + "] VALUES(@param1)"
    let db = new SqlCommand(sQL, cn)
    db.Parameters.AddWithValue("@param1", tableData)
    db.ExecuteNonQuery()

当我运行代码时,我得到这个参数异常指向executeNonQuery:

System.Data.dll中发生类型'System.ArgumentException'的异常,但未在用户代码中处理

附加信息:不存在从对象类型System.Object []到已知托管提供程序本机类型的映射。

现在,我只使用2个表,但是很快该程序将要使用具有不同列名的多个表,因此无论它要写入哪个表,我都需要使用它。 table1和table2具有相同的列。 表3和表4的列相同,但表1和表2的列不同。

selectedData是一个包含其他对象数组的对象数组。

如果您认为有一种添加数据而不是添加数组的更好方法,请告诉我。

任何帮助,将不胜感激。

您需要使用表值参数 我认为这里最简单的方法是将您的chosenData转换为SqlDataRecord数组,然后执行

let sQL = "INSERT INTO [" + tableName + "] SELECT * FROM @param1"

让cn = new SqlConnection(connectionstring)cn.Open()

for i=0 to tableData.Length-1 do
    let mutable columnsTemp = ""
    let mutable valuesTemp = ""
    for j = 0 to tableData.Item(i).Length-2 do
        columnsTemp <- columnsTemp + columnNames.GetValue(j).ToString() + ","
        valuesTemp <- valuesTemp + "'" + tableData.Item(i).GetValue(j).ToString() + "',"


    let columns = columnsTemp.Remove(columnsTemp.Length-1,1)
    let values = valuesTemp.Remove(valuesTemp.Length-1,1)
    let sQL = "INSERT INTO [" + tableName + "] (" + columns + ") VALUES (" + values + ")"
    let db = new SqlCommand(sQL, cn)
    db.ExecuteNonQuery()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM