SQL命令返回空值

时间:2019-06-11 15:26:41

标签: c# sql asp.net

我以前只熟悉Linq等用于数据访问的内容。我现在正在做一些事情,要求我在后端使用实际的SQL命令来返回单个值。我的代码可以编译并运行,但是对于我知道应该返回除空字符串之外的值的值,它返回null。

这是我的构想吗?还是缺少其他东西?

下面是我的代码:

  internal string GetSexDescription(string sex, int id_merchant)
    {
        string newSex = "";

        var builder = new ConnectionStringHelper();
        var connString = builder.getCasinoDBString(id_merchant);

        using (SqlConnection conn = new SqlConnection(connString))
        {
            string sql = "SELECT Description FROM person_gender_lookup WHERE ID = @sex";

            SqlCommand cmd = new SqlCommand(sql, conn);
            try
            {
                cmd.Parameters.Add("@Sex", SqlDbType.VarChar).Value = sex;

                newSex = cmd.ExecuteScalar().ToString();
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

            return newSex;
        }
    }

这是表的结果集的图片:

enter image description here

4 个答案:

答案 0 :(得分:2)

打开连接。

internal string GetSexDescription(string sex, int id_merchant)
{
   string newSex = "";

   var builder = new ConnectionStringHelper();
   var connString = builder.getCasinoDBString(id_merchant);

   using (SqlConnection conn = new SqlConnection(connString))
   {
      conn.Open(); //<- This line here.
      string sql = "SELECT Description FROM person_gender_lookup WHERE ID = @sex";

      SqlCommand cmd = new SqlCommand(sql, conn);
      try
      {
         cmd.Parameters.Add("@Sex", SqlDbType.VarChar).Value = sex;

         newSex = cmd.ExecuteScalar().ToString();
      }
      catch(Exception ex)
      {
         Console.WriteLine(ex.Message);
      }

      return newSex;
   }
}

cmd.ExecuteScalar()可能会抛出InvalidOperationException,因为您尚未打开连接。捕获到异常后,将其输出到控制台,然后自从newSex调用开始以来,将返回ExecuteScalar的初始值。

答案 1 :(得分:1)

ID是int还是varchar? 如果为int,则使用:

cmd.Parameters.Add("@sex", SqlDbType.Int).Value = sex;

代替:

cmd.Parameters.Add("@Sex", SqlDbType.VarChar).Value = sex;

P.S。 查询参数和参数添加到cmd中。参数区分大小写。

@sex

代替

@Sex

答案 2 :(得分:0)

弄清楚了。在我将newSex变量设置为要拉取的值之后,必须打开并关闭cmd。

   internal string GetSexDescription(string sex, int id_merchant)
    {
        string newSex = "";

        var builder = new ConnectionStringHelper();
        var connString = builder.getCasinoDBString(id_merchant);

        DataSet ds = new DataSet();

        using (SqlDataAdapter adapter = new SqlDataAdapter())
        {
            using (SqlConnection conn = new SqlConnection(connString))
            {
                string sql = "SELECT Description FROM person_gender_lookup WHERE ID = @Sex";

                SqlCommand cmd = new SqlCommand(sql, conn);
                try
                {
                    conn.Open();
                    cmd.Connection = conn;
                    adapter.SelectCommand = cmd;
                    cmd.Parameters.Add("@Sex", SqlDbType.VarChar).Value = sex;
                    adapter.Fill(ds);

                    newSex = cmd.ExecuteScalar().ToString();

                    conn.Close();

                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }

                return newSex;
            }
        }

    }

答案 3 :(得分:-1)

尝试一下:

internal string GetSexDescription(string sex, int id_merchant)
{
    string newSex = "";

    var builder = new ConnectionStringHelper();
    var connString = builder.getCasinoDBString(id_merchant);

    using (SqlConnection conn = new SqlConnection(connString))
    {
        string sql = "SELECT Description FROM person_gender_lookup WHERE ID" +  sex;;

        SqlCommand cmd = new SqlCommand(sql, conn);
        try
        {


            newSex = cmd.ExecuteScalar().ToString();
        }
        catch(Exception ex)
        {
            Console.WriteLine(ex.Message);
        }

        return newSex;
    }
}