C# ExecuteOnQuery:CommandText属性尚未在c中初始化#

C# ExecuteOnQuery:CommandText属性尚未在c中初始化#,c#,asp.net,sqlexception,aspxgridview,C#,Asp.net,Sqlexception,Aspxgridview,我正在尝试从数据库中动态生成的gridview的textbox插入数据。但是,我得到了一个异常,CommandText属性尚未初始化cmd.executeNonQuery() 您没有将查询的第一部分加载到StringBuilder。试试这个: private void InsertRecords(StringCollection sc) { const string sqlStatement = "INSERT INTO Ingredients_List (Ingredients1) V

我正在尝试从数据库中动态生成的
gridview
textbox
插入数据。但是,我得到了一个异常,
CommandText
属性尚未初始化
cmd.executeNonQuery()


您没有将查询的第一部分加载到
StringBuilder
。试试这个:

private void InsertRecords(StringCollection sc)
{
    const string sqlStatement = "INSERT INTO Ingredients_List (Ingredients1) VALUES";
    StringBuilder sb = new StringBuilder(sqlStatement);
    string[] splitItems = null;
    foreach (string item in sc)
    {
        if (item.Contains(","))
        {
            splitItems = item.Split(",".ToCharArray());
           sb.AppendFormat("{0}('{1}'); ", sqlStatement, splitItems[0]);
        }
    }
    //  conn.Open();
    using (SqlConnection connn = new SqlConnection(GetConnectionString()))
    {
        using (SqlCommand cmd = new SqlCommand(sb.ToString(), connn))
        {
            connn.Open();
            //      cmd.CommandType = CommandType.Text;
            cmd.ExecuteNonQuery();
            connn.Close();
        }
        // Page.ClientScript.RegisterClientScriptBlock(typeof(Page), "Script", "alert('Records Successfuly Saved!');", true);
    }
}
编辑-我已经构建了一个测试数据库并调试了以下代码。它适用于我通过的测试数据

    private void InsertRecords(StringCollection sc)
    {
        const string sqlStatement = "INSERT INTO Ingredients_List (Ingredients1) VALUES";
        StringBuilder sb = new StringBuilder();

        foreach (string item in sc)
        {
            if (item.Contains(","))
            {
                var splitItems = item.Split(",".ToCharArray());
                sb.AppendFormat("{0}('{1}'); ", sqlStatement, splitItems[0]);
            }

        }
        Console.WriteLine(sb.ToString());
        //  conn.Open();
        using (SqlConnection connn = new SqlConnection(ConfigurationManager.ConnectionStrings["whatever"].ConnectionString))

        {
            using (SqlCommand cmd = new SqlCommand(sb.ToString(), connn))
            {
                connn.Open();
                cmd.ExecuteNonQuery();
                connn.Close();
            }
            // Page.ClientScript.RegisterClientScriptBlock(typeof(Page), "Script", "alert('Records Successfuly Saved!');", true);
        }
    }
我对它进行了如下测试:

...
var collection = new StringCollection{"a,x", "b,y", "c,z"};

InsertRecords(collection);
SELECT [Ingredients1]
  FROM [Ingredients_List]
执行数据库查询以查看数据,如下所示:

...
var collection = new StringCollection{"a,x", "b,y", "c,z"};

InsertRecords(collection);
SELECT [Ingredients1]
  FROM [Ingredients_List]
结果:

Ingredients1
------------
a
b
c

问题的原因是,在循环之后,您没有检查是否在StringBuilder中插入了任何内容。如果没有带逗号的字符串,那么foreach语句中的内部条件会使stringbuilder为空,并且命令将永远不会有正确的命令文本

解决方法应该很简单,比如添加一个测试来查看StringBuilder中是否有一些文本,但我更倾向于建议您使用一个
列表

StringBuilder sb=新的StringBuilder(string.Empty);
List prms=新列表();
字符串[]splitItems=null;
//用于动态创建参数占位符的基本字符串
string sqlStatement=“插入成分列表(Ingredits1)值(@p{0});”;
整数计数=1;
foreach(sc中的字符串项)
{
如果(项包含(“,”))
{
splitItems=item.Split(',');
//动态创建的参数名
Add(新的SqlParameter($“@p{count}”,SqlDbType.NVarChar){Value=splitItems[0]});
//为第n个参数创建占位符
sb.AppendFormat(sqlStatement,count);
}
}
//如果没有参数(或stringbuilder为空),则不执行任何操作
如果(prms.Count>0)
{
使用(SqlConnection connn=newsqlconnection(GetConnectionString()))
使用(SqlCommand cmd=newsqlcommand(sb.ToString(),connn))
{
connn.Open();
//将所有参数相加
cmd.Parameters.AddRange(prms);
cmd.ExecuteNonQuery();
}
}

sb.tostring()返回什么?1)您没有将sqlStatement追加到StringBuilder 2)除非在项中有一个,否则您不会将其插入数据库。3) 请使用参数化查询。这样更安全。您当前的方法对SQL注入非常开放。我试图做的是创建动态textbox onClick事件,然后将数据保存到数据库中。那么如何使用参数化查询呢?我用的这个例子@john Your 1)看起来不对。
sb.AppendFormat
包括它,除了你第2点的情况。@hvd啊,我错了。必须是2)然后。在执行查询之前转储
StringBuilder
的内容,以准确查看要执行的查询。我不知道您将向这个函数传递什么,我正在尽全力帮助您,但如果您愿意,我很乐意删除我的答案。var collection=new StringCollection{“a”、“b”、“c”}@Steve,是的,我是这样开始的,但是你会看到Tanmay的代码包含一个
项。包含(“,”
,它在其中评估集合中的每个成员。如果项目不包含逗号,则不会跳过该项目,也不会将其插入数据库。我不知道为什么它是这样写的。@换句话说,这是OP的代码和修改后的代码失败的一个例子,OP询问错误。我想要的是每次用户单击并在数据库中添加数据时,在行中有三个文本框。如果你有任何其他的例子,那么我不介意使用它。