繁体   English   中英

从代码隐藏调用存储过程

[英]Calling stored procedure from code-behind

点击这里看表我写了一个存储过程来获取表值。 但是我不知道如何编写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
{               
}

应用程序配置文件

<?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# 代码?

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();

控制台打印结果在此处输入图片说明

结果

我的测试表一开始是空的

在此处输入图片说明

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

在此处输入图片说明

当我然后运行我的脚本时,我的测试表如下所示:

在此处输入图片说明

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

应该是这样的,然后尝试:

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

您需要使用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();
      }

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

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隐式完成

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM