从C#中的存储过程中获取一点值

时间:2016-09-11 00:55:13

标签: c# sql-server stored-procedures parameters

情况如下,我在SQL Server中有一个存储过程,这有几个输出参数,其中一个是位类型,我想要的是取该参数的值,但是我有一个转换错误,InvalidCastException

这是我的代码:

public void exec()
       {
            String strConnString = "Server=.\\SQLEXPRESS;Database=recalls;Integrated Security=true";
            SqlConnection con = new SqlConnection(strConnString);
            SqlCommand cmd = new SqlCommand();
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = "findVinCamp";
            int c = Int32.Parse(campaing.Text);
            cmd.Parameters.Add("@camp", SqlDbType.Int).Value = c;
            cmd.Parameters.Add("@vin", SqlDbType.VarChar, 100).Value = vin.Text;
            cmd.Parameters.Add("@desc", SqlDbType.NVarChar, 255).Direction = ParameterDirection.Output;
            cmd.Parameters.Add("@st", SqlDbType.VarChar, 50).Direction = ParameterDirection.Output;
            cmd.Parameters.Add("@bit", SqlDbType.Bit).Direction = ParameterDirection.Output;
            cmd.Connection = con;
            con.Open();
            cmd.ExecuteNonQuery();
            bit = (int)cmd.Parameters["@bit"].Value; //Exception Here
            if (bit == 1)
            {
                desc.Text = cmd.Parameters["@desc"].Value.ToString();
                stt.Text = cmd.Parameters["@st"].Value.ToString();
                camp = cmd.Parameters["@camp"].Value.ToString();
                if (stt.Text.Equals("APPLIED"))
                {
                    stt.ForeColor = System.Drawing.Color.LawnGreen;
                }
                else
                {
                    stt.ForeColor = System.Drawing.Color.Firebrick;
                    label3.Enabled = true;
                    newstatus.Enabled = true;
                    update.Enabled = true;
                }
            }
            else
            {
                MessageBox.Show("Doesn't exits!");
            }
    }

我正在尝试将bit参数分配给int变量。关于评论的任何问题。

4 个答案:

答案 0 :(得分:2)

我将(int)更改为此,现在效果很好:

Boolean lol = Convert.ToBoolean(cmd.Parameters["@bit"].Value);

答案 1 :(得分:1)

我相信有点会转换为布尔值。哪个应该使你的代码更简单。

即。

...
var bit = (bool)cmd.Parameters["@bit"].Value;
if (bit)
{
...

答案 2 :(得分:1)

使用以下行

bool isConfirmed = (bool)cmd.Parameters["@bit"].Value;
if(isConfirmed ){
                desc.Text = cmd.Parameters["@desc"].Value.ToString();
                stt.Text = cmd.Parameters["@st"].Value.ToString();
                camp = cmd.Parameters["@camp"].Value.ToString();
                if (stt.Text.Equals("APPLIED"))
                {
                    stt.ForeColor = System.Drawing.Color.LawnGreen;
                }
                else
                {
                    stt.ForeColor = System.Drawing.Color.Firebrick;
                    label3.Enabled = true;
                    newstatus.Enabled = true;
                    update.Enabled = true;
                }

}
else{
MessageBox.Show("Doesn't exits!");
}

**更新:**如果位列允许空值 - 您可以通过多种方式执行此操作

bool isConfirmed = cmd.Parameters["@bit"].Value as bool? ?? null;

并阅读此内容 - SQL Server Data Types and Their .NET Framework Equivalents

答案 3 :(得分:0)

您正在尝试将布尔输出转换为INT,请将其转换为布尔值:

bool bitValue= Convert.ToBoolean(cmd.Parameters["@bit"].Value)