返回Int的Nvarchar列上的SELECT查询

时间:2014-01-23 15:37:34

标签: c# sql

我正在尝试从我的数据库返回一个字符串值,但是查询返回“0”,尽管SELECT查询的目标是nvarchar列。 查询有效并正确运行,在使用SQL-SMS运行时返回“KYO”。

这个方法在我使用它的其他地方按预期工作,我用它来返回数据:

    public static object GetData(string sql, SqlParameter[] parameters)
    {
        try
        {
            using (DbConnection connection = factory.CreateConnection())
            {
                connection.ConnectionString = connectionString;

                using (DbCommand command = factory.CreateCommand())
                {
                    command.Connection  = connection;
                    command.CommandType = CommandType.Text;
                    command.CommandText = sql;

                    if (parameters != null)
                    {
                        foreach (var parameter in parameters)
                        {
                            if (parameter != null)
                                command.Parameters.Add(parameter);
                        }
                    }

                    object result = null;
                    SqlParameter returnValue = new SqlParameter("ReturnValue", result);
                    returnValue.Direction    = ParameterDirection.ReturnValue;
                    command.Parameters.Add(returnValue);

                    connection.Open();
                    command.ExecuteScalar();
                    result = command.Parameters["ReturnValue"].Value;
                    return result;
                }
            }
        }
        catch (Exception)
        {
            throw;
        }
    }
}

这是抛出强制转换异常的方法,因为它返回的是int而不是字符串:

    private static String GetManufacturerCode(Int32 manufacturerID)
    {
        try
        {
            StringBuilder sql = new StringBuilder();
            sql.Append("SELECT ManufacturerCode FROM Manufacturers WHERE ManufacturerID = @ID");

            SqlParameter id = new SqlParameter("@ID", manufacturerID);

            return(String)DB.GetData(sql.ToString(), new[] { id });
        }
        catch (Exception)
        {

            throw;
        }
    }

我还将returnValue.DbType = DbType.String;设置为测试,但仍然返回一个整数。

我成功使用GetData(...)方法的一个例子是:

    public static Int32 GetMonitoredCount()
    {
        try
        {
            String GetMonitoredCount = "SELECT COUNT(*) FROM Devices WHERE Monitored = 1 ";

            return (Int32)DB.GetData(GetMonitoredCount, null);
        }
        catch (Exception)
        {
            throw;
        }
    }

我认为它可能会返回一个布尔位,但是当我的查询正确执行时,我认为它会返回1而不是0.

为什么返回一个整数?如何使用我的模式返回一个字符串?

1 个答案:

答案 0 :(得分:4)

ReturnValue总是返回int - 这是设计的。

而不是整个块

object result = null;
SqlParameter returnValue = new SqlParameter("ReturnValue", result);
returnValue.Direction    = ParameterDirection.ReturnValue;
command.Parameters.Add(returnValue);

connection.Open();
command.ExecuteScalar();
result = command.Parameters["ReturnValue"].Value;

尝试

connection.Open();
object result = command.ExecuteScalar();

这将返回您的SQL语句的真实结果

方法ExecuteScalar本身能够返回值 - 它返回结果集第一行的第一列,并且在查询返回单个值时非常理想。