【问题标题】:"Specified cast is not valid" on SQL "OUTPUT" parameterSQL“OUTPUT”参数上的“指定转换无效”
【发布时间】:2014-05-13 16:17:14
【问题描述】:

我正在开发一个 ASP.NET 网站,但偶然发现了一个问题。我一直在将 ASP.NET 论坛转换为 ASP.NET 4.5。我已经修复了所有问题,并且该网站在我的本地开发机器上运行得非常好。将其上传到我的网络主机后,我会收到以下错误。

“/”应用程序中的服务器错误。

指定的转换无效。

我一直在试图弄清楚,但我很难过。这是代码、SQL表和存储过程。

    public static int GetWebIDAndFolder(string host, out string folder)
    {
        SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["CrzyForumConnectionString"].ConnectionString);
        SqlCommand cmd = new SqlCommand("CWF_GetWebIDAndFolder", conn);

        host = host.Replace("www.", "");

        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add("@WebDomain", SqlDbType.NVarChar, 50);
        cmd.Parameters.Add("@WebID", SqlDbType.Int, 4);
        cmd.Parameters.Add("@Folder", SqlDbType.NVarChar, 50);
        cmd.Parameters[0].Value = host;
        cmd.Parameters[1].Direction = ParameterDirection.Output;
        cmd.Parameters[2].Direction = ParameterDirection.Output;

        conn.Open();
        cmd.ExecuteNonQuery();


        int webID = (int)cmd.Parameters[1].Value;

        if (Convert.IsDBNull(cmd.Parameters[2].Value))
            folder = string.Empty;
        else
            folder = (string)cmd.Parameters[2].Value;

        conn.Close();

        return webID;
    }

SQL 表:

CREATE TABLE [dbo].[CWF_Webs] (
[WebDomain] NVARCHAR (50) COLLATE Latin1_General_CI_AS NOT NULL,
[WebID]     INT           NOT NULL,
[Folder]    NVARCHAR (50) COLLATE Latin1_General_CI_AS NULL
);

存储过程

CREATE PROCEDURE [indie_world].CWF_GetWebIDAndFolder
(
@WebDomain  nvarchar(50),
@WebID      int OUTPUT,
@Folder     nvarchar(50) OUTPUT
)
AS

SELECT @WebID = (SELECT WebID FROM CWF_Webs WHERE WebDomain = @WebDomain)
SELECT @Folder = (SELECT Folder FROM CWF_Webs WHERE WebDomain = @WebDomain)

我们将不胜感激任何和所有帮助。代码、表格和过程均来自该项目来自以下网址。 http://www.codeproject.com/Articles/4291/Riverside-Internet-Forums。它是我正在转换为基于简单论坛并开始扩展它的应用程序。

【问题讨论】:

  • 哪一行报错了?
  • 其实不是一个坏问题,但这是一个很好的例子,说明为什么缩小问题范围很重要。

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


【解决方案1】:

我会更改使用键而不是索引的参数分配

cmd.Parameters["@WebDomain"].Value = host;
cmd.Parameters["@WebID"].Direction = ParameterDirection.Output;
cmd.Parameters["@Folder"].Direction = ParameterDirection.Output;

以及使用key获取值

int webID = cmd.Parameters["@WebID"].Value as int;
if(webID==0){
// something is wrong with your query
}

【讨论】:

    【解决方案2】:

    我现在看到参数是输出的,我看到你是SELECTING 参数中的值。每当我使用也有 RESULTSET(即 SELECT 语句)的 OUTPUT 参数时,我必须先关闭阅读器。

    您是否尝试过以下方法之一?

    更改 SPROC:

    SET @WebID = (SELECT WebID FROM CWF_Webs WHERE WebDomain = @WebDomain)
    SET @Folder = (SELECT Folder FROM CWF_Webs WHERE WebDomain = @WebDomain)
    

    或者不要更改 SQL 并使用 DataReader,然后在完成 Reading() 后将其关闭:

    using( System.Data.Common.DbDataReader rdr = cmd.ExecuteReader() )
    {
       while(rdr.Read())
       {
       }
    }
    int webID = (int)cmd.Parameters[1].Value;
    

    【讨论】:

    • 感谢您的帮助。在调试问题时更改 SPROC 确实有帮助。
    【解决方案3】:

    经过一天的折腾,我想通了。感谢大家的反馈。问题是数据库表中的主机。如果它只是在寻找 url.com 而不是 http://url.com,我已经添加了 http://。

    【讨论】:

      猜你喜欢
      • 2012-06-12
      • 1970-01-01
      • 2014-07-09
      • 2012-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多