从代码隐藏调用存储过程

时间:2017-10-26 06:58:26

标签: c# sql .net sql-server stored-procedures

click here to see the table我写了一个存储过程来获取表值。但我不知道如何编写C#代码来调用存储过程。我想在控制台中运行它。

我的存储过程:

alter procedure sampleone (@createdOn nvarchar(200))
as
begin
    select * 
    from sa_test
    where createdOn = @createdOn
end

示例试用代码:

try
{
    string connectionString = "(CString)";
    string commandText = "sampleone";

    using (SqlConnection conn = new SqlConnection(connectionString))
    {
         SqlCommand cmd = new SqlCommand(commandText, conn);
         cmd.CommandType = CommandType.StoredProcedure;
         cmd.Parameters.AddWithValue("@createdOn",25/10/2017);
         cmd.CommandTimeout = 600;

         conn.Open();
         int affectedRows = cmd.ExecuteNonQuery();
         conn.Close();
    }
}
catch
{               
}

app.config

<?xml version="1.0" encoding="utf-8" ?>

<configuration>
  <connectionStrings>

<add name="CString" connectionString="data source=34.193.27.161;User Id=sa; Pwd=RCK$1234; Initial Catalog=rs" providerName="System.Data.SqlClient"/>


  </connectionStrings>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>
</configuration>

有人可以帮助我获取C#代码吗?

4 个答案:

答案 0 :(得分:1)

Soo,基于你真正想要的东西,你的脚本看起来会有所不同。但是,您应该考虑将逻辑放在哪里。您希望存储过程插入数据还是希望C#执行此操作?否则,这是一个使用存储过程插入数据的示例:

注意

  

由于我住在另一个国家/地区,我的日期明显不同 - 只需将日期更改回您想要的结果和日期格式。

<强>注2

  

考虑将存储过程中的createdON变量设置为日期而不是nvarchar。

SQL代码

    --Build table for test inserts
CREATE TABLE  dbo.testtable (
Name nvarchar(50),
Createdon date
)

--Insert dummy values to sa_test
INSERT INTO sa_test
values('Thomas','2017-10-10'),
('Hans','2017-12-25')

--Edit stored procedure to not just select but also insert data based on @createdOn variable
create procedure sampleone (@createdOn nvarchar(200))
as
begin

insert into testtable (Name,createdon)
    select * 
    from sa_test
    where createdon= @createdOn
end

C#代码

 string conn = "Server=EGC25199;Initial Catalog=LegOgSpass;Integrated Security=True";
 string query = "sampleone";

 SqlConnection connDatabase = new SqlConnection(conn);
 connDatabase.Open();

 SqlCommand cmd = new SqlCommand(query, connDatabase);
 cmd.CommandType = CommandType.StoredProcedure;

 cmd.Parameters.Add("@createdOn", SqlDbType.Date).Value = "2017-10-10"; 
 cmd.ExecuteNonQuery();
 connDatabase.Close();

带有数据表和打印到控制台的C#代码

 string conn = "Server=EGC25199;Initial Catalog=LegOgSpass;Integrated Security=True";
 string query = "sampleone";

        DataTable dt = new DataTable();
 SqlConnection connDatabase = new SqlConnection(conn);
 connDatabase.Open();

 SqlCommand cmd = new SqlCommand(query, connDatabase);
        using (var da = new SqlDataAdapter(cmd)) 
        {
            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.Add("@createdOn", SqlDbType.Date).Value = "2017-10-10"; //Adding the selected items to parameter @check
            cmd.ExecuteNonQuery();
            da.Fill(dt);


            foreach( DataRow row in dt.Rows)
            {
                Console.WriteLine();
                for (int x = 0; x < dt.Columns.Count; x++)
                {
                    Console.Write(row[x].ToString() + " ");
                }
            }
        }

        connDatabase.Close();

控制台打印结果 enter image description here

<强>结果

  

我的测试表最初是空的

enter image description here

  

sa_test表有2个我可以选择的值

enter image description here

当我运行我的脚本时,我的测试表看起来像这样:

enter image description here

答案 1 :(得分:0)

cmd.Parameters.AddWithValue("@createdOn",25/10/2017);

应该是这样并尝试:

cmd.Parameters.AddWithValue("@createdOn","25/10/2017");

答案 2 :(得分:0)

您需要使用ExecuteReader从SP获取返回数据。传递参数时还有TYPO。

cmd.Parameters.AddWithValue("@createdOn","25/10/2017");

更新代码

  using (SqlConnection conn = new SqlConnection(connectionString))
      {
        SqlCommand cmd = new SqlCommand(commandText, conn);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@createdOn","25/10/2017");
        cmd.CommandTimeout = 600;

        conn.Open();
        var reader = cmd.ExecuteReader();
        while (reader.Read())
        {

        }
        conn.Close();
      }

答案 3 :(得分:0)

你可以遵循这个简单的技术:

try
{
    string connectionString = ConfigurationManager.ConnectionStrings["CString"].ConnectionString);
    string commandText = "sampleone";

    DataTable table = new DataTable();
    using(var con = new SqlConnection(connectionString))
        using(var cmd = new SqlCommand(commandText, con))
            using(var da = new SqlDataAdapter(cmd))
            {
                cmd.Parameters.Add("@createdOn", SqlDbType.NVarChar, 50).Value = "25/10/2017";
                cmd.CommandType = CommandType.StoredProcedure;
                da.Fill(table);
            }
}
catch
{               
}

使用上面的代码,您的存储过程数据将填充到数据表table。然后,您可以将此table用于各种用途,例如处理数据,将数据填充到数据网格等。此技术的另一个好处是,您甚至不需要打开/关闭连接。这将由DataAdapter da

隐式完成