F# SqlCommand 动态写入 SQL table
F# SqlCommand dynamically write to SQL table
所以我试图从一个 table (table1) 获取数据,然后将 selected 数据写入第二个 table (table2).我能够从 table1 和 select 获取我想要的数据。我无法将其写入 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.ArgumentException' 类型的异常发生在 System.Data.dll 但未在用户代码中处理
附加信息:不存在从对象类型 System.Object[] 到已知托管提供程序本机类型的映射。
目前我只使用 2 个 table,但很快该程序将使用具有不同列名的多个 table,因此无论如何我都需要它来工作它正在写入的 table 中。 table1 和 table2 具有相同的列。 tables 3 和 4 具有相同的列,但它们与 tables 1 和 2 具有不同的列。
chosenData 是一个包含其他对象数组的对象数组。
如果您认为有更好的方法来添加数据而不是添加数组,请告诉我。
如有任何帮助,我们将不胜感激。
您需要使用 table-valued parameter。我认为这里最简单的方法是将您的 chosenData
转换为 SqlDataRecord
的数组,然后执行
let sQL = "INSERT INTO [" + tableName + "] SELECT * FROM @param1"
let 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()
所以我试图从一个 table (table1) 获取数据,然后将 selected 数据写入第二个 table (table2).我能够从 table1 和 select 获取我想要的数据。我无法将其写入 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.ArgumentException' 类型的异常发生在 System.Data.dll 但未在用户代码中处理
附加信息:不存在从对象类型 System.Object[] 到已知托管提供程序本机类型的映射。
目前我只使用 2 个 table,但很快该程序将使用具有不同列名的多个 table,因此无论如何我都需要它来工作它正在写入的 table 中。 table1 和 table2 具有相同的列。 tables 3 和 4 具有相同的列,但它们与 tables 1 和 2 具有不同的列。
chosenData 是一个包含其他对象数组的对象数组。
如果您认为有更好的方法来添加数据而不是添加数组,请告诉我。
如有任何帮助,我们将不胜感激。
您需要使用 table-valued parameter。我认为这里最简单的方法是将您的 chosenData
转换为 SqlDataRecord
的数组,然后执行
let sQL = "INSERT INTO [" + tableName + "] SELECT * FROM @param1"
let 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()