【问题标题】:Input on a stored sql procedure using C#使用 C# 在存储的 sql 过程中输入
【发布时间】:2017-02-22 07:51:19
【问题描述】:

在 sql 中,我通常使用

执行我的过程
exec dbo.usp_FCS 'TIMV','serial'

我在 c# 中尝试了一些相同的东西,但似乎我弄错了

   using (SqlConnection connection = new SqlConnection("Data Source=;Initial Catalog=;User ID=;Password="))
            {
                using (SqlCommand cmd = new SqlCommand("usp_FCS_GetUnitInfo_Takaya" + "'" + MachineName + " ','serial' " , connection))
                {
                        try
                    {
                           
                            connection.Open();
                            SqlDataAdapter da = new SqlDataAdapter(cmd);
                    }

                        catch (SqlException ex)
                    {
                        label6.Visible = true;
                        label6.Text = string.Format("Failed to Access Database!\r\n\r\nError: {0}", ex.Message);
                        return;
                    }
                }
            }

我的问题是,如何使用 c# 为我的存储过程提供这两个输入“TIMV”和“串行”?

编辑:

我尝试过这样的事情:

 using (SqlCommand cmd = new SqlCommand("usp_FCS_GetUnitInfo_Takaya"  , connection))
                {
                        cmd.CommandType = CommandType.StoredProcedure;
                        cmd.Parameters.Add("@p1", SqlDbType.VarChar).Value = MachineName;
                        cmd.Parameters.Add("@p2", SqlDbType.VarChar).Value = "serial";
                        try
                    {    my code...

还是不行

【问题讨论】:

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


【解决方案1】:

向 SqlCommand 添加参数的最正确方法是通过 Add 方法,该方法允许您指定参数的数据类型,如果是字符串和小数,还可以指定这些值的大小和精度。这样,数据库引擎优化器可以存储您的查询以供重复使用,并且在您第二次调用它时速度会快很多。在你的情况下,我会写

cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@mname", SqlDbType.NVarChar, 20).Value = MachineName;
cmd.Parameters.Add("@serial", SqlDbType.NVarChar, 20).Value = "serial";

这假定您的存储过程接收到两个名为 EXACTLY @mname@serial 的参数,参数的类型是 NVarChar 和预计长度为 20 个字符。为了给出更准确的答案,我们至少需要看到 sp 的第一行。

在您上面的代码中,也缺少命令的执行。在您执行它之前,仅创建命令什么都不做。鉴于存在 SqlDataAdapter,我认为您想要填充 DataSet 或 DataTable 并将此对象用作网格的 DataSource。像这样的

SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt);
yourDataGrid.DataSource = dt;

如果这是一个 ASP.NET 应用程序,还有 DataBind 调用

yourDataGrid.DataBind();

【讨论】:

  • 我必须问为什么这会起作用?我的意思是我刚刚添加了一个数据网格并填充了网格并且不知何故它起作用了?什么给了?
  • 重点是:参数的确切数据类型、大小和名称。 CommandType = CommandType.StoredProcedure 是基本的,否则 CommandText 将被解释为查询(选择、更新...)当然填充 DataTable(da.Fill(dt))对于在网格上显示任何内容是必需的
  • 让我解释一下我所拥有的。我没有使用您的示例,我使用了AddWithValue(我知道它不好,但我试图证明一点)。我有 2 个程序如果我尝试在不运行第一个的情况下运行第二个,第二个会引发错误。我试图让它以各种可能的方式工作,添加参数,但在我使用 DataTable 之前没有任何效果,我不明白为什么?
  • 呃,不看新代码很难说。我建议发布一个新问题,其中包含有关此问题的详细信息。更多人可以看到您的问题并尝试解决它
【解决方案2】:

您使用SqlCommand 类的Parameters 集合将参数发送到存储过程。

假设您的参数名称是 @p1@p2(为了您的利益,请不要使用这样的名称)- 您的 c# 代码将如下所示:

using (var cmd = new SqlCommand("usp_FCS_GetUnitInfo_Takaya", connection))
{
    cmd..CommandType = CommandType.StoredProcedure;
    cmd.Parameters.Add("@p1", SqlDbType.VarChar).Value = MachineName;
    cmd.Parameters.Add("@21", SqlDbType.VarChar).Value = "serial";

    try
    {
       // rest of your code goes here....

注意:使用适合参数数据类型的SqlDbType 值。

【讨论】:

  • 我还需要添加任何程序集引用吗?
  • 错误 CS1061 'int' 不包含 'Value' 的定义,并且找不到接受第一个类型为 'int' 的参数的扩展方法 'Value'(您是否缺少 using 指令或程序集参考?)
【解决方案3】:

试试这个:

   DataSet ds = new DataSet("dts");
        using (SqlConnection conn = new SqlConnection
          ("Data Source=;Initial  Catalog=;User ID=;Password="))
        {
            try
            {
    SqlCommand sqlComm = new  SqlCommand("usp_FCS_GetUnitInfo_Takaya",conn);
                sqlComm.Parameters.AddWithValue("@p1", MachineName);
                sqlComm.Parameters.AddWithValue("@p2", "serial");
                sqlComm.CommandType = CommandType.StoredProcedure;
                SqlDataAdapter da = new SqlDataAdapter();
                da.SelectCommand = sqlComm;
                da.Fill(ds);
            }
            catch (Exception e)
            {
                label6.Visible = true;
                label6.Text = string.Format
              ("Failed to Access  Database!\r\n\r\nError: {0}", ex.Message);
                return;
            }
猜你喜欢
  • 1970-01-01
  • 2015-01-25
  • 1970-01-01
  • 2011-08-03
  • 2012-07-02
  • 2019-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多