0

我有一个名为tbDepartment(id, title, abbreviation) 的表和一个GridView包含两列 Title 和 Abbreviation

我需要知道用户在 gridView 中插入的 Title 是否与 table 中的相同tbDepartment。如果为真,我想获取 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]));
}
4

4 回答 4

3

首先使用 ExecuteScalar 执行查询以获取 ID。如果它返回一个非空值(意味着您找到了标题),那么您就有了您的 ID。否则执行新数据的插入。

同时,不要使用字符串连接来执行 sql 命令。(SQL 注入

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]) 在插入查询中,您使用同一个网格单元格来更新列的值,AbbreviationTitle使用另一个单元格更新列gridView3.GetRowCellValue(i, gridView3.Columns[DepDesc]))可能正确的插入文本是:

string sql2 = "Insert into tbDepartment ([Title], [Abbreviation]) values (@DepCode, @Desc)";
于 2013-02-13T15:27:01.357 回答
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
}
于 2013-02-13T15:25:19.587 回答
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();
   }

}
于 2013-02-13T15:37:04.137 回答
0

但是sqlDep设置为字符串的一个实例。它永远不会为空。你需要重新评估你的逻辑。

于 2013-02-13T15:20:08.330 回答