Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在表中插入多个生成的值_C#_Sql_Asp.net - Fatal编程技术网

C# 在表中插入多个生成的值

C# 在表中插入多个生成的值,c#,sql,asp.net,C#,Sql,Asp.net,首先,我的问题很复杂,我不太擅长详细解释,所以我想提前说声对不起 好的,事情是这样的。我执行这个查询 string count = "SELECT Count(*) FROM Student WHERE IntakeID = 'MYVALUE'" 它将返回10的数字。因此,我继续使用以下代码: SqlCommand cmd = new SqlCommand(count, conn); int temp = Convert.ToInt32(cmd.ExecuteScalar(

首先,我的问题很复杂,我不太擅长详细解释,所以我想提前说声对不起

好的,事情是这样的。我执行这个查询

string count = "SELECT Count(*) FROM Student WHERE IntakeID = 'MYVALUE'"
它将返回10的数字。因此,我继续使用以下代码:

SqlCommand cmd = new SqlCommand(count, conn);
int temp = Convert.ToInt32(cmd.ExecuteScalar().ToString());
for (int x = 0; x < temp; x++)
{
     string query = "INSERT INTO Docket (DocketNo, StudentID) VALUES ('" + getUniqueKey() + "','(SELECT StudentID FROM Student WHERE IntakeID = 'MYVALUE')')
}
如果你不清楚我的问题,我会尽力把它说清楚。很抱歉给您带来不便

更新答案: 在狗仔队的帮助下谢谢!对于他的代码,我修改并提出了自己的解决方案

string count = "SELECT StudentID FROM Student WHERE IntakeID = 'MYVALUE'"
SqlCommand cmd = new SqlCommand(count, conn);
string query = "INSERT INTO Docket (DocketNo, StudentID) VALUES ";
conn.Open();
SqlDataReader rdr = cmd.ExecuteReader();
    if (rdr.HasRows)
    {
        var loop = true;
        while (loop)
        {
            loop = rdr.Read();
            if (!loop)
            {
             //When end of rows and no more data to be retrieve, it removes the last "," from  the query.
                char[] trimChar = { ',' };
                string newQuery = query.TrimEnd(trimChar);
                cmd.CommandText = newQuery;
            }
            else { 
                query += "('" + GetUniqueKey() + "','" + rdr.GetString(0) + "')";
                query += ",";
            }
            
        }
    }
cmd.ExecuteNonQuery();
conn.Close();
因此,实际上,在SqlDataReader上循环时,查询将在后台生成如下内容:

INSERT INTO  Docket(DocketNo, StudentID) VALUES ('1562456','TP028800'), ('1465446','TP028801'),..........('4939104','TP028810'),
请注意,由于查询+=,;,所以在查询的末尾将有一个逗号,;。当SqlDataReader不再返回行时,它将执行if!循环语句以从查询中删除最后一个逗号

如果您不清楚+=的用途,请访问

更新2: @狗仔队已经想出了一个更有效和性能明智的方法,如果你正在管理一个巨大的数据。在他自己的帖子中查找他的代码:

string count = "SELECT StudentID FROM Student WHERE IntakeID = 'MYVALUE'"
SqlCommand cmd = new SqlCommand(count, conn);
string query = "INSERT INTO Docket (DocketNo, StudentID) VALUES ";
conn.Open();
bool first = true;
using (SqlDataReader rdr = cmd.ExecuteReader())
{
    while (rdr.Read())
    {
        if (first)
          first = false;
        else 
           query += ", "
        query += "('" + getUniqueKey() + "', '" + rdr.GetString(0) + "')";  
    }
}
if (!first)
{
    cmd.CommandText = query + ";";
    cmd.ExecuteNonQuery();  
}
conn.Close();
StringBuilder比字符串上的+=快 我认为多个值限制在1000以内,但比单个插入更有效 因此,如果您可以获得1000多个,则需要添加一个计数器并启动插入

string getID = "SELECT StudentID FROM Student WHERE IntakeID = 'MYVALUE'"
SqlCommand cmd = new SqlCommand(getID , conn);
string insert = "INSERT INTO Docket (DocketNo, StudentID) VALUES ";
Int32 count = 0;
StringBuiler sb = new StringBuiler();
conn.Open();    
using (SqlDataReader rdr = cmd.ExecuteReader())
{
    while (rdr.Read())
    {
        if (count == 0)
        { 
            sb.Clear();
            sb.AppendLine(insert);
        }
        else 
           sb.Append(", ")
        sb.Append("('" + getUniqueKey() + "', '" + rdr.GetString(0) + "')");
        count++;
        if(count > 800)
        {
            count = 0;
            cmd.CommandText = sb.ToString() + ";";
            cmd.ExecuteNonQuery(); 
            // most likely need a separate cmd here has a open reader 
            // will leave that as an exercise for you 
            // could even go asynch if you want to get faster
            // or you could just build up multiple inserts on sb 
        }  
    }
}
if (count > 0)
{
    cmd.CommandText = sb.ToString() + ";";
    cmd.ExecuteNonQuery();
}
conn.Close();

使用参数而不是串接字符串,您应该更好地解释“MYVALUE”是如何变化的。这可能是一把钥匙point@Steve您之所以担心使用参数而不是串接字符串,是因为SQL注入,对吗?”“MYVALUE”只是我从DropDownList中得到的一个值,我将其编码为+DropDownList 1.SelectedItem.value+谢谢,我尝试后会告诉你结果。我已经修改了一些代码,因为它有一些小错误,但仍然不起作用。我不确定我错过了什么。它给我一个错误,当没有数据存在时,尝试读取无效。当它到达query+='+getUniqueKey+'、'+rdr.GetString0+'的行时@ChuahChengJun是的,有一个大洞。我是凭记忆写的。将更新。您好,在您的代码帮助下,我设法想出了自己的解决方案。谢谢你,伙计!我让你写了自己的等效代码,但你不觉得这个简单地不加逗号的答案更干净、更有效吗?对于一个开放的阅读器,我认为ExecuteOnQuery将失败。不能像字符串一样工作查询+=因为+=是一个无效的表达式项,即使你修复了+=这不是一个有效的插入。
string getID = "SELECT StudentID FROM Student WHERE IntakeID = 'MYVALUE'"
SqlCommand cmd = new SqlCommand(getID , conn);
string insert = "INSERT INTO Docket (DocketNo, StudentID) VALUES ";
Int32 count = 0;
StringBuiler sb = new StringBuiler();
conn.Open();    
using (SqlDataReader rdr = cmd.ExecuteReader())
{
    while (rdr.Read())
    {
        if (count == 0)
        { 
            sb.Clear();
            sb.AppendLine(insert);
        }
        else 
           sb.Append(", ")
        sb.Append("('" + getUniqueKey() + "', '" + rdr.GetString(0) + "')");
        count++;
        if(count > 800)
        {
            count = 0;
            cmd.CommandText = sb.ToString() + ";";
            cmd.ExecuteNonQuery(); 
            // most likely need a separate cmd here has a open reader 
            // will leave that as an exercise for you 
            // could even go asynch if you want to get faster
            // or you could just build up multiple inserts on sb 
        }  
    }
}
if (count > 0)
{
    cmd.CommandText = sb.ToString() + ";";
    cmd.ExecuteNonQuery();
}
conn.Close();
SqlCommand cmd = new SqlCommand(count, conn);
int temp = Convert.ToInt32(cmd.ExecuteScalar().ToString());
for (int x = 0; x < temp; x++)
{
     string query += "INSERT INTO Docket (DocketNo, StudentID) VALUES ('" + getUniqueKey() + "','(SELECT StudentID FROM Student WHERE IntakeID = 'MYVALUE')');";


}
SqlCommand cmd = new SqlCommand(query, conn);
cmd.ExecuteQuery();