C# 使用cmd.c参数创建动态查询
我知道有很多问题与创建动态查询有关,但没有人能帮助我。 我试图在foreach循环的帮助下创建一个动态cmd.Parameters.AddWithValue,但是我找不到在foreach中传递的所有值。我知道我在写var values=这就是值给我空值的方式 我提供的代码可能会帮助您解决错误C# 使用cmd.c参数创建动态查询,c#,sql,asp.net,stored-procedures,dynamicquery,C#,Sql,Asp.net,Stored Procedures,Dynamicquery,我知道有很多问题与创建动态查询有关,但没有人能帮助我。 我试图在foreach循环的帮助下创建一个动态cmd.Parameters.AddWithValue,但是我找不到在foreach中传递的所有值。我知道我在写var values=这就是值给我空值的方式 我提供的代码可能会帮助您解决错误 public void insert_Para(System.Web.UI.HtmlControls.HtmlGenericControl ControlName, String TableName)
public void insert_Para(System.Web.UI.HtmlControls.HtmlGenericControl ControlName, String TableName)
{
using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["con"].ToString()))
{
var values = "";
SqlCommand cmd = new SqlCommand("insert into "+ TableName +" values(" + values + ")", con);
cmd.CommandType = System.Data.CommandType.StoredProcedure;
foreach (var item in ControlName.Controls)
{
if (item is TextBox)
{
cmd.Parameters.AddWithValue("@" + ((TextBox)item).ID, ((TextBox)item).Text);
values += "@" + ((TextBox)item).ID + ",";
}
}
if (con.State == ConnectionState.Closed)
con.Open();
cmd.ExecuteNonQuery();
}
}
这里的问题主要是时间问题。当字符串为空字符串时,您当前正在从一开始就将值连接到该字符串中。完成后:就这样-这就是您创建的SQL:
insert into Foo values()
这不会有帮助的。我会将连接延迟到循环之后:
foreach (var item in ControlName.Controls)
{
if (item is TextBox)
{
cmd.Parameters.AddWithValue("@" + ((TextBox)item).ID, ((TextBox)item).Text);
values += "@" + ((TextBox)item).ID + ",";
}
}
cmd.CommandText = "insert into "+ TableName +" values(" + values + ")";
或者我会在整个过程中使用StringBuilder:
var sql = new StringBuilder("insert into [").Append(TableName)
.Append("] values(");
foreach (var item in ControlName.Controls)
{
if (item is TextBox)
{
cmd.Parameters.AddWithValue("@" + ((TextBox)item).ID, ((TextBox)item).Text);
sql.Append("@").Append(((TextBox)item).ID).Append(",");
}
}
cmd.CommandText = sql.Append(")").ToString();
另请注意:这是CommandType.CommandText,不是CommandType.StoredProcess。请尝试此代码
public void Insert_Data_generic(DataSet dsins)
{
SqlConnection con = new SqlConnection(connectionstring);
string Result = "insert into TableName (";
SqlCommand cmd = new SqlCommand();
con.Open();
string columns = string.Join(",", dsins.Tables[0].Columns.Cast<DataColumn>().Select(c => c.ColumnName));
string values = string.Join(",", dsins.Tables[0].Columns.Cast<DataColumn>().Select(c => string.Format("@{0}", c.ColumnName)));
Result += columns + ") values(" + values + ")";
foreach (DataRow row in dsins.Tables[0].Rows)
{
cmd = new SqlCommand(Result, con);
cmd.Parameters.Clear();
foreach (DataColumn col in dsins.Tables[0].Columns)
{
cmd.Parameters.AddWithValue("@" + col.ColumnName, row[col]);
}
cmd.ExecuteNonQuery();
}
}
问题是创建insert语句的字符串已设置。如果更改值,则不会更改SqlCommand@MarcGravell查询本身只是对SomeTable值的插入,没有任何参数或值。条件块在不实际更改查询的情况下添加参数。此代码既不是动态的,也不使用任何参数。构造查询时,值为空,这意味着SqlCommand对象试图对某个表执行无效查询。@PanagiotisKanavos它显然是要参数化的,与我回答的注释相反;它不工作的事实不应该让我们感到惊讶-如果代码按预期工作,我们很少看到关于这一点的问题:作为旁注:如果这是创建SQL的方式,那么您将非常容易受到控件顺序的影响-现在假设控件顺序与您假设@Minhaj Patel有一个数据集的列顺序完全匹配。这还需要额外调用数据库以获取元数据列名。您没有从OP中的文本框提供值。您没有处理SqlConnection或SqlCommand。