C# 从SQL表中获取值并对其设置条件

C# 从SQL表中获取值并对其设置条件,c#,sql,C#,Sql,我有一个名为tbDepartment(id,title,缩写)的表和一个GridView包含两列title和缩写 我需要知道用户在gridView中插入的标题是否等于表tbDepartment中的标题。如果为true,我希望获取id,否则我需要创建新用户 我写的不是输入if语句。有人能告诉我怎么改正吗 string sql2 = "Insert into tbDepartment ([Title], [Abbreviation]) values (@Desc, @DepCode)"; stri

我有一个名为
tbDepartment
(id,title,缩写)的表和一个
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]));
}

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

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

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
}

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
}

首先执行一个查询以获取带有ExecuteScalar的ID。如果它返回一个NOTNULL值(意味着你已经找到了标题),你就有了你的ID。否则执行新数据的插入

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

这其中的一部分是,在您上面的查询中,有一些不太正确的地方。 您可以从
gridView3.GetRowCellValue(i,gridView3.Columns[DepCode])
但是在insert查询中,您使用相同的网格单元来更新列
缩写
的值,而
标题
列则使用另一个单元
gridView3.GetRowCellValue(i,gridView3.Columns[DepDesc])进行更新。
正确的插入文本可能是:

string sql2 = "Insert into tbDepartment ([Title], [Abbreviation]) values (@DepCode, @Desc)";

首先执行一个查询以获取带有ExecuteScalar的ID。如果它返回一个NOTNULL值(意味着你已经找到了标题),你就有了你的ID。否则执行新数据的插入

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

这其中的一部分是,在您上面的查询中,有一些不太正确的地方。 您可以从
gridView3.GetRowCellValue(i,gridView3.Columns[DepCode])
但是在insert查询中,您使用相同的网格单元来更新列
缩写
的值,而
标题
列则使用另一个单元
gridView3.GetRowCellValue(i,gridView3.Columns[DepDesc])进行更新。
正确的插入文本可能是:

string sql2 = "Insert into tbDepartment ([Title], [Abbreviation]) values (@DepCode, @Desc)";

确保在执行之前打开连接。使用
使用
将确保在使用连接后对其进行处理。首先执行DateReader以检查任何记录,然后执行非查询以插入。此外,您可以在单个查询或使用存储过程中完成此操作

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();
   }

}

确保在执行之前打开连接。使用
使用
将确保在使用连接后对其进行处理。首先执行DateReader以检查任何记录,然后执行非查询以插入。此外,您可以在单个查询或使用存储过程中完成此操作

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();
   }

}


为什么sqlDep是空的?您将一个string实例设置为
sqlDep
,然后在检查它是否为
null
?我的意思是。。假设它为0非空..我将把它扔到那里:
SQL+String concatenation=BAD
我想我现在看到问题了。您认为您编写的查询的结果会在sqlDep变量中吗?为什么sqlDep会为null?您将一个string实例设置为
sqlDep
,然后在检查它是否为
null
?我的意思是。。假设它为0非空..我将把它扔到那里:
SQL+String concatenation=BAD
我想我现在看到问题了。您认为您编写的查询结果会出现在sqlDep变量中吗?我是c语言的新手,不知道如何设置包含id@Nejthe您试图用行
字符串sqlDep=…
实现什么?你的意思是如果
gridView3.GetRowCellValue(i,gridView3.Columns[DepCode]).ToString()
为空,谁的东西将为空?如果表中的标题不等于gridView3.GetRowCellValue(i,gridView3.Columns[DepCode])。ToString()我将不会获得任何ID,因此字符串将为空。。这就是我的想法我是c语言新手,我不知道如何设置包含id@Nejthe您试图用行
字符串sqlDep=…
实现什么?你的意思是如果
gridView3.GetRowCellValue(i,gridView3.Columns[DepCode]).ToString()
为空,谁的东西将为空?如果表中的标题不等于gridView3.GetRowCellValue(i,gridView3.Columns[DepCode])。ToString()我将不会获得任何ID,因此字符串将为空。。这就是我在考虑+1如何在sql命令中使用参数并建议不要使用字符串连接。这真的很有帮助..很好的解释。。感谢..+1使用参数并建议不要在sql命令中使用字符串连接。这真的很有帮助..很好的解释。。谢谢你,这样做很正确。。太棒了!!没问题,我很高兴能帮助你。那工作做得很正确。。太棒了!!没问题,我很高兴能帮助你。