【问题标题】:Read .sql script with parameters读取带参数的 .sql 脚本
【发布时间】:2015-02-27 13:26:54
【问题描述】:

我有一个包含以下代码的 .sql 脚本

-- Drop stored procedure if it already exists
USE Temp

IF EXISTS (
  SELECT * 
    FROM INFORMATION_SCHEMA.ROUTINES 
   WHERE SPECIFIC_SCHEMA = N'Custom'
     AND SPECIFIC_NAME = N'RestoreVersion' 
)
   DROP PROCEDURE Custom.RestoreVersion
GO

CREATE PROCEDURE Custom.RestoreVersion
    @ID INT
AS
    SELECT * FROM [App].[Version] WHERE ID = @ID
    DROP PROCEDURE Custom.RestoreVersion
GO

EXECUTE Custom.RestoreVersion @ID = [ID from c# program]
GO

我想获取这个文件并在 c# 中设置@ID 参数,然后运行 ​​sql 脚本。

我希望这个脚本存在于我的应用程序的一个文件夹中,但我无法让它工作。

我试过这个。

Console.Write(Server_Name + Environment.NewLine);
connectSqlServer(Server_Name);

SqlDataReader rdr = null;

Console.WriteLine("\nGet Version\n");
try
{
    SqlCommand cmd = new SqlCommand("Custom.RestoreVersion", conn);

    cmd.CommandType = System.Data.CommandType.StoredProcedure;

    cmd.Parameters.Add(new SqlParameter("@ID", ID));

    rdr = cmd.ExecuteReader();

    while (rdr.Read())
    {
        Console.WriteLine(Values);
    }
}
finally
{
    if (conn != null)
    {
        conn.Close();
    }
    if (rdr != null)
    {
        rdr.Close();
    }
}   

但是我无法从资源文件夹中读取文件并将参数输入数据库。

【问题讨论】:

  • 程序自行删除?你得到了什么错误
  • 代码中没有可以从文件中读取的内容,因此它不会读取也就不足为奇了。为什么你认为它会?
  • 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
  • 另外脚本只创建存储过程,它不运行它,因此不需要参数有值。我不明白这两个方面是如何匹配的
  • 是的,proc 会自行删除,因为我们不想在最后将程序留在服务器上,这显然是完整 proc 的一小部分。我已经编辑了问题,结果是副本和过去无法正常工作,所以错过了。我在最后运行它。 @Guffa对不起,我的问题是如何让它从文件中读取,因为每当我尝试从文件中读取时,我只能读取到字符串,或者你会读取到字符串然后在字符串中进行替换?感谢应有的注意。

标签: c# sql-server parameter-passing


【解决方案1】:

创建一个删除自身只是为了参数化某些东西的过程是没有任何目的的;你可以直接这样做:

using(SqlCommand cmd = new SqlCommand(
    "SELECT * FROM [App].[Version] WHERE ID = @ID", conn))
{
    cmd.Parameters.Add(new SqlParameter("@ID", ID));
    using(var rdr = cmd.ExecuteReader()
    {
        while (rdr.Read())
        {
            var id = rdr.GetInt32(0);
            var name = rdr.GetString(1);
            // etc
        }
    }
}

或者使用像 dapper 这样的工具:

foreach(var row in conn.Query("SELECT * FROM [App].[Version] WHERE ID = @ID",
       new { ID })
{
    int id = row.Id;
    string name = row.Name
    // etc
}

从 cmets 看来,问题在于更大的查询;有几种方法可以做到这一点;最简单的方法是反正用 C# 编写代码,例如:

var sql = @"
-- this is a long query
declare @foo table(id int not null)
insert @foo (id)
select RangeId
from SomeTable
where Category = @category

select ... /* blah blah

lots more blah */";

cmd.CommandText = sql;
cmd.Parameters.AddWithValue("category", whatever);
// ...

或者,如果您确实希望将查询分开:

cmd.CommandText = ReadQueryFromResources("myquery");

【讨论】:

    猜你喜欢
    • 2012-06-03
    • 1970-01-01
    • 2013-07-10
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    • 2018-11-18
    • 2015-05-23
    • 1970-01-01
    相关资源
    最近更新 更多