问题遇到的现象和发生背景
C# asp.net中添加数据遇到的问题
报的异常是必须声明必须声明标量变量 "@id"。
问题相关代码,请勿粘贴截图
```c#
protected void AddTKButton_Click(object sender, EventArgs e)
{
//获取界面数据
Models.tkInfo tk = new Models.tkInfo();
// string id = Request.QueryString["id"];
tk.title = TKMC.Text;
tk.tklx = TKLX.SelectedValue;
tk.cs1 = CS1.Text;
tk.cs2 = CS2.Text;
tk.cs3 = CS3.Text;
tk.cs4 = CS4.Text;
tk.score =int.Parse(Score.Text);
tk.result = Result.Text;
//保存数据
Models.BLLResult result = new BLL.TKBLL().AddTK(tk);
if (result.code == 1)
{
Response.Write("<script>alert('新增成功');window.location.href='ListTK.aspx';</script>");
}
else
{
string msg = Server.HtmlEncode(result.msg.Replace("\r", "").Replace("\n", ""));
Response.Write("<script>alert('" + msg + "');window.location.href='ListTK.aspx';</script>");
}
}
DAL层相关的代码
public int AddTK(Models.tkInfo tk)
{
return DBA.Insert(tk, new string[] { "id" });
}
```c#
BLL层相关代码
public Models.BLLResult AddTK(Models.tkInfo tk)
{
Models.BLLResult result = new Models.BLLResult();
//常规校验
if (string.IsNullOrEmpty(tk.title))
{
result.SetError("请输入题库标题");
return result;
}
if (string.IsNullOrEmpty(tk.tklx))
{
result.SetError("请选择题库类型");
return result;
}
if (string.IsNullOrEmpty(tk.cs1))
{
result.SetError("请输入选项一");
return result;
}
if (string.IsNullOrEmpty(tk.cs2))
{
result.SetError("请输入选项二");
return result;
}
if (tk.tklx != "判断题")
{
if (string.IsNullOrEmpty(tk.cs3))
{
result.SetError("请输入选项三");
return result;
}
if (string.IsNullOrEmpty(tk.cs4))
{
result.SetError("请输入选项四");
return result;
}
}
else
{
tk.cs3 = null;
tk.cs4 = null;
}
if (tk.score <= 0)
{
result.SetError("请输入分值");
return result;
}
if (string.IsNullOrEmpty(tk.result))
{
result.SetError("请输入答案");
return result;
}
//新增数据
try
{
new DAL.TKDAL().AddTK(tk);
result.SetData(null);
return result;
}
catch (Exception ex)
{
result.SetError("系统异常:" + ex.Message);
return result;
}
```c#
DATA层的相关方法代码
public int Insert<T>(T t,string[] identitiyCols) where T:class,new()
{
//获取泛型数据的属性数组
PropertyInfo[] pi_arr = t.GetType().GetProperties();
//定义参数集合
List<SqlParameter> parameters = new List<SqlParameter>();
//获取表名(我们约定表明跟类名一样)
string tableName = t.GetType().Name;
//定义储存列的可变字符串
StringBuilder sColName = new StringBuilder();
//定义储存列值的可变字符串
StringBuilder sColValue = new StringBuilder();
foreach (PropertyInfo pi in pi_arr)
{
//获取列
string colName = pi.Name;
//设置列
if (sColName.Length > 0) sColName.Append(",");
sColName.Append(colName);
//设置值
if (sColValue.Length > 0) sColValue.Append(",");
sColValue.Append("@" + colName);
//获取列的值(获取列的值一般是object类型)
object colValue = pi.GetValue(t, null);
//自增长的主键不允许显示插入,如果存在则continue执行下一个属性
if (identitiyCols != null)
{
if (ArrayUtil.CheckArrayHasData(identitiyCols, colName)) continue;
}
//当colValue=null时则将参数的值设置为DBValue.null,否则用获取得到的值
if (colValue == null)
{
SqlParameter parameter = new SqlParameter("@" + colName, colValue);
//将参数加入到参数集合
parameters.Add(parameter);
}
else
{
SqlParameter parameter = new SqlParameter("@" + colName, colValue);
//将参数加入到参数集合
parameters.Add(parameter);
}
}
string sql = string.Format(" insert into {0} ({1}) values ({2}) ", tableName, sColName.ToString(), sColValue.ToString());
Console.WriteLine(sql);
return ExecuteNonQuery(sql, parameters.ToArray());
}
运行结果及报错内容
系统异常:必须声明标量变量 "@"。
我的解答思路和尝试过的方法
此窗口没用到datagridview控件,网上搜的方法没有用