使用Windows服务进行行计数

时间:2015-02-17 10:57:20

标签: c# windows-services asp.net-mvc-5

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

2 个答案:

答案 0 :(得分:1)

你的代码几乎就在那里。您只需要实际从SQL查询中读取结果的部分。 ExecuteNonQuery只是执行查询但不返回结果(它确实返回UPDATEINSERTDELETE的受影响行数,但是一个简单的选择不会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();
        }