SqlDataReader在项目之间表现不同

时间:2013-08-24 23:07:13

标签: c# sqldatareader

我的项目是一个Windows服务,我无法从我的数据库返回值,因此我将代码中的一部分分离到一个控制台应用程序中以便于调试,但在我的服务中不起作用的代码在控制台应用程序。

所以在我的服务中我有这个课程

public class DBHandler
{
    public string ReadSQL(string sql)
    {
        try
        {
            using (SqlConnection DBConnection = new SqlConnection(@"Data Source=***;Initial Catalog=***;Integrated Security=True;User ID=***;Password=***"))
            {
                DBConnection.Open();
                SqlCommand DBCommand = new SqlCommand(sql, DBConnection);
                SqlDataReader sqlResults = DBCommand.ExecuteReader();
                if (sqlResults.HasRows)
                {
                    while (sqlResults.Read())
                    {
                        return sqlResults.GetString(0);
                    }
                }
                return sqlResults.HasRows.ToString();
            }
        }
        catch (Exception e)
        {
    return e.ToString();
    }
}

我正在使用

DBHandler dbHandler = new DBHandler();
WriteToClientStream(clientStream, dbHandler.ReadSQL(string.Format("SELECT PlayerName FROM Player WHERE PlayerName = '{0}'", UserName)) + "\r\n");

sqlResults.HasRows返回false,但同一查询返回SQL Server和测试控制台应用程序中的结果

public static void Main(string[] args)
{
    Console.WriteLine(ReadSQL(string.Format("SELECT PlayerName FROM Player WHERE PlayerName = '{0}'", "Hex")));
    Console.ReadLine();
}

public static string ReadSQL(string sql)
{
    try
    {
        using (SqlConnection DBConnection = new SqlConnection(@"Data Source=***;Initial Xatalog=***;Integrated Security=True;User ID=***;Password=***"))
        {
            DBConnection.Open();
            SqlCommand DBCommand = new SqlCommand(sql, DBConnection);
            SqlDataReader sqlResults = DBCommand.ExecuteReader();
            if (sqlResults.HasRows)
            {
                while (sqlResults.Read())
                {
                    return sqlResults.GetString(0);
                }
            }
            return sqlResults.HasRows.ToString();
        }
    }
    catch (Exception e)
    {
        return e.ToString();
    }
}

2 个答案:

答案 0 :(得分:2)

也许这个问题比你想象的要容易。

如果在服务器中尝试相同的参数,就像在控制台应用程序中一样?

因此,请更改现有代码:

   WriteToClientStream(clientStream, dbHandler.ReadSQL(string.Format(
    "SELECT PlayerName FROM Player WHERE PlayerName = '{0}'", UserName)) + "\r\n");

要:

WriteToClientStream(clientStream, dbHandler.ReadSQL(string.Format(
"SELECT PlayerName FROM Player WHERE PlayerName = '{0}'", "Hex")));

如果有效,请试试。

如果是,如果您正确传递UserName,则可能需要检查您的代码。

答案 1 :(得分:1)

可能是因为在将chars编码为byte[]

之后,在字符串末尾尾随string

运行System.Text.Encoding.UTF8.GetString(message)后检查以确保没有空终止符或新行等。

示例:

System.Text.Encoding.UTF8.GetString(message).TrimEnd('\0', '\n');