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命令中使用字符串连接。这真的很有帮助..很好的解释。。谢谢你,这样做很正确。。太棒了!!没问题,我很高兴能帮助你。那工作做得很正确。。太棒了!!没问题,我很高兴能帮助你。