我有一个名为tbDepartment
(id,title,abbreviation)的表和一个GridView
,其中包含两列Title和缩写
我需要知道用户在gridView中插入的标题是否等于表tbDepartment
中的标题。如果为true我想获取id,否则我需要创建新用户。
我写的不是输入if语句。有人能告诉我如何纠正它吗?
string sql2 = "Insert into tbDepartment ([Title], [Abbreviation]) values (@Desc, @DepCode)";
string sqlDep = "Select [ID] from tbDepartment where Title = '" + gridView3.GetRowCellValue(i, gridView3.Columns[DepCode]).ToString() +"'" ;
SqlCommand cmdDep = new SqlCommand(sql2, connection);
if (sqlDep == 0)
{
cmdDep.Parameters.Add("@Desc", SqlDbType.VarChar,50);
cmdDep.Parameters.Add("@DepCode", SqlDbType.VarChar, 50);
cmdDep.Parameters["@Desc"].Value = Convert.ToString(gridView3.GetRowCellValue(i, gridView3.Columns[DepDesc]));
cmdDep.Parameters["@DepCode"].Value = Convert.ToString(gridView3.GetRowCellValue(i, gridView3.Columns[DepCode]));
}
答案 0 :(得分:3)
首先执行查询以使用ExecuteScalar获取ID。如果它返回非空值(意味着您已找到标题),则表示您拥有自己的ID。否则执行新数据的插入。
同时,不要使用字符串连接来执行sql命令。 (SQL Injections)
string sql2 = "Insert into tbDepartment ([Title], [Abbreviation]) values (@Desc, @DepCode)";
string sqlDep = "Select [ID] from tbDepartment where Title = @title"
SqlCommand cmdDep = new SqlCommand(sqlDep, connection);
cmdDep.Parameters.AddWithValue("@title", gridView3.GetRowCellValue(i, gridView3.Columns[DepCode]).ToString();
object result = cmdDep.ExecuteScalar();
if(result != null)
{
cmdDep.Parameters.Clear();
cmdDep.CommandText = sql2;
cmdDep.Parameters.AddWithValue("@Desc", Convert.ToString(gridView3.GetRowCellValue(i, gridView3.Columns[DepDesc]);
cmdDep.Parameters.AddWithValue("@DepCode", Convert.ToString(gridView3.GetRowCellValue(i, gridView3.Columns[DepCode]));
cmdDep.ExecuteNonQuery();
}
else
int id = Convert.ToInt32(result);
此处的一部分,上面的查询中有不太正确的内容。
您可以从Title
获取搜索gridView3.GetRowCellValue(i, gridView3.Columns[DepCode])
的值
但是在插入查询中,您使用相同的网格单元来更新列Abbreviation
的值,而使用另一个单元Title
更新gridView3.GetRowCellValue(i, gridView3.Columns[DepDesc]))
列可能正确的插入文本是:
string sql2 = "Insert into tbDepartment ([Title], [Abbreviation]) values (@DepCode, @Desc)";
答案 1 :(得分:1)
SqlCommand.ExecuteScalar
返回查询返回的结果集中第一行的第一列。这是你得到你的id或否则为null。
string sql2 = "Insert into tbDepartment ([Title], [Abbreviation]) values (@Desc, @DepCode)";
string sqlDep = "Select [ID] from tbDepartment where Title = '" + gridView3.GetRowCellValue(i, gridView3.Columns[DepCode]).ToString() +"'" ;
SqlCommand cmdDep = new SqlCommand(sql2, connection);
SqlCommand cmdUser = new SqlCommand(sqlDep , connection);
var id = cmdUser.ExecuteScalar() as int?;
if (id == null) //nothing found
{
//add new
cmdDep.Parameters.Add("@Desc", SqlDbType.VarChar,50);
cmdDep.Parameters.Add("@DepCode", SqlDbType.VarChar, 50);
cmdDep.Parameters["@Desc"].Value = Convert.ToString(gridView3.GetRowCellValue(i, gridView3.Columns[DepDesc]));
cmdDep.Parameters["@DepCode"].Value = Convert.ToString(gridView3.GetRowCellValue(i, gridView3.Columns[DepCode]));
}
else
{
//edit
}
答案 2 :(得分:1)
确保在执行前打开连接。使用using
将确保在使用后处置连接。首先执行DateReader以检查任何记录,然后执行要插入的NonQuery。此外,您可以在单个查询中或使用存储过程执行此操作。
using(SqlConnection con = new SqlConnection("YourConnectionString"))
{
string selectQuery = "Select [ID] from tbDepartment where Title = @Title";
SqlCommand cmd = new SqlCommand(selectQuery, con);
cmd.Parameters.AddWithValues("@Title", "Title_Value");
con.Open();
SqlDataReader reader = cmd.ExecuteReader();
if(!reader.HasRows){
string insertQuery = "Insert into tbDepartment ([Title], [Abbreviation]) " +
"values (@Title, @Abb)";
cmd.CommandText = insertQuery;
cmd.Parameters.AddWithValues("@Abb", "Abb_Value");
cmd.ExecuteNonQuery();
}
}
答案 3 :(得分:0)
但sqlDep
设置为字符串的实例。它永远不会为空。您需要重新评估您的逻辑。