【发布时间】:2020-04-05 04:41:28
【问题描述】:
我必须从 DataGridView 填充 SQL 表。问题实际上在于,我有一堆具有不同列数的表,我不能编写一个简单的脚本来“逐行”填充它,所以我决定通过 DataTable 推送数据,但我得到一个错误
表类型参数“@data”必须有一个有效的类型名称
我的代码:
private void button1_Click(object sender, EventArgs e)
{
SqlDataReader sqlReader = null;
SqlConnection sqlConnection = new SqlConnection(connectionString);
sqlConnection.Open();
var dt = new DataTable();
dt = (DataTable)dataGridView1.DataSource;
try
{
using (SqlCommand command = new SqlCommand(@"DELETE FROM [DB].[dbo].[" + comboBox1.SelectedItem.ToString()+ "]; INSERT INTO [DB].[dbo].[" + comboBox1.SelectedItem.ToString()+ "] VALUES (@data)",sqlConnection))
{
command.Parameters.AddWithValue("@data", dt);
command.ExecuteNonQuery();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message.ToString(), ex.Source.ToString(), MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
if (sqlReader != null)
sqlReader.Close();
}
}
comboBox1.SelectedItem.ToString() 返回表名。
查询的第一部分是删除表,否则它将重复未更改的信息,在此之后我将它发送回来,因为 dataGridView 有所有数据
【问题讨论】:
-
当你使用DataTable运行时,考虑使用带有参数为DataTableType的存储过程,它可以解决你所有的问题。
-
@TấnNguyên 那么我必须如何设置它的类型
CREATE PROCEDURE LoadData @table [TYPE]? -
CREATE TYPE YourTableType AS TABLE()如创建表脚本。然后CREATE PROCEDURE LoadData @table YourTableTypeFor more information -
@TấnNguyên 这是否意味着我必须创建一些程序,因为我的表中有不同的列数,或者有一些方法可以使任何列数动态化?正如我所见,我必须在
CREATE TYPE YourTableType AS TABLE()之后放置带有其类型的列 -
TableType 可以是通用的,可以重用,不需要像目标表那样填满列。然后,您可以在过程中将表名作为第二个参数传递,以协调应插入的表。但是,如果您有更复杂的 DataTableType,请考虑一种表类型的一个过程。这是您未来实施的选择。