【问题标题】:Variable number of inserts into database可变数量的插入数据库
【发布时间】:2021-03-18 12:17:15
【问题描述】:

我正在向负责将数据插入数据库的方法发送一个表 (GridViewRowCollection)。每一行都将成为数据库表中的一行,也是用户编写的,因此可以是 1 行或 100 行。

我知道如何通过串联来实现,但是作为用户输入我需要对其进行参数化,并且通过参数化做一些动态的事情我不知道如何或从哪里开始。

任何人都可以对这件事有所了解吗?

【问题讨论】:

  • 要么遍历行集,一次插入 1 行(这会很慢),要么使用表类型参数。
  • 另一种方法是传递一个JSON字符串参数并使用INSERT...SELECT...FROM OPENJSON...
  • 这与单个插入几乎相同,但参数数量可变。我只想在参数名称中增加一个数字以避免歧义。
  • 那个,让我有点困惑,如果我花一些时间仔细阅读它可能是一个解决方案,但 Crowcoder 提供的解决方案对我来说非常有效。

标签: c# sql-server sql-insert


【解决方案1】:

如果你要一个一个地做,这就是模式。未显示健壮的数据验证或异常处理。您还必须更改参数以满足您的需要,它们显然不会(全部)是长度为 10 的 varchar。这部分是伪代码:

using (SqlConnection con = new SqlConnection("the connection string"))
using (SqlCommand cmd = con.CreateCommand())
{
    cmd.CommandType = CommandType.Text; // assuming not a stored procedure
    
    cmd.CommandText = "INSERT INTO [Your_Table_Name] (val1, val2, etc.) VALUES (@param1, @param2, etc.);"
    
    cmd.Parameters.Add(new SqlParameter("@param1", SqlDbType.VarChar, 10));
    cmd.Parameters.Add(new SqlParameter("@param2", SqlDbType.VarChar, 10));
    //etc.
    
    con.Open();
    
    for (int i = 0; i < row count; i++)
    {
        cmd.Parameters["param 1"].Value = //whatever value from row
        cmd.Parameters["param 2"].Value = //whatever other value from row
        //etc
        
        int numberOfRowsAffected =  cmd.ExecuteNonQuery();
    }
}

【讨论】:

  • 如果我希望其中一个参数保持不变,我只需要在 AddWithValue 之外 for loop 并且所有插入都将使用该常量参数,对吧?
  • 是的,这可行,但不鼓励使用AddWithValue,因为它可能导致效率低下或精度损失,具体取决于列的数据类型。只需通过Value 属性设置值并确保参数 sqldbtype 与数据库匹配..
【解决方案2】:
猜你喜欢
  • 2021-12-05
  • 2012-07-09
  • 2017-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多