我是ASP.Net的新手。我有一个最近的项目需要使用Windows服务读取数据库。在将该记录写入数据库之前,我需要检查数据库是否存在记录。我不知道该怎么做。如果任何人都可以提供简单的示例代码,那就太棒了。
string strConn = ConfigurationManager.ConnectionStrings["MyDBConfig"].ConnectionString;
SqlConnection oSqlConnection = new SqlConnection(strConn);
oSqlConnection.Open();
string commandText = @"SELECT COUNT (*) FROM csvs WHERE Agency='BBB'";
using (var command = new SqlCommand(commandText, oSqlConnection))
{
command.ExecuteNonQuery();
}
答案 0 :(得分:1)
你的代码几乎就在那里。您只需要实际从SQL查询中读取结果的部分。 ExecuteNonQuery
只是执行查询但不返回结果(它确实返回UPDATE
,INSERT
和DELETE
的受影响行数,但是一个简单的选择不会t影响任何行。)
此代码执行查询并检查返回值是否大于零。
bool recordExists = false;
string strConn = ConfigurationManager.ConnectionStrings["MyDBConfig"].ConnectionString;
SqlConnection oSqlConnection = new SqlConnection(strConn);
oSqlConnection.Open();
string commandText = @"SELECT COUNT (*) FROM csvs WHERE Agency='BBB'";
using (var command = new SqlCommand(commandText, oSqlConnection))
{
int recCnt = Convert.ToInt32(command.ExecuteScalar());
if (recCnt > 0)
recordExists = true;
}
注意:ExecuteScalar()
返回System.Object
类型的对象。返回的实际类型取决于查询,在您的情况下,某些数字类型取决于OleDb驱动程序。 Convert.ToInt32()
会将返回值转换为int
,然后您可以检查代码。 Convert.ToInt32()
优先于使用(int)
的显式广告,因为Convert.ToInt32()
也适用于其他数字类型。在这种特定情况下,显式转换可能完全相同。
答案 1 :(得分:0)
有效的方法是使用StoredProcedure。您应该学习使用StoredProcedures进行复杂/多行查询。由于您是.net的新手以及此场景中的所有内容,因此您的代码应如下所示: -
string strConn = ConfigurationManager.ConnectionStrings["MyDBConfig"].ConnectionString;
SqlConnection oSqlConnection = new SqlConnection(strConn);
oSqlConnection.Open();
var sql= "if not exists(Select count(id) from csvs where Agency=@agency) begin
insert into csvs(columnA,columnB) values('abcd','efgh') end";
using (var command = new SqlCommand(sql, oSqlConnection))
{
command.Parameters.AddWithValue("@agency",agency);
command.ExecuteNonQuery();
}