SQL“OUTPUT”参数上的“指定的强制转换无效”

时间:2014-05-13 16:17:15

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

我正在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)

任何和所有帮助将不胜感激。代码,表和过程全部来自项目来自以下URL。 http://www.codeproject.com/Articles/4291/Riverside-Internet-Forums。它是应用程序im转换为基础的简单论坛并开始扩展它。

3 个答案:

答案 0 :(得分:0)

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

您是否尝试过以下其中一项?

更改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;

答案 1 :(得分:0)

我会更改使用键而不是索引

的参数分配
cmd.Parameters["@WebDomain"].Value = host;
cmd.Parameters["@WebID"].Direction = ParameterDirection.Output;
cmd.Parameters["@Folder"].Direction = ParameterDirection.Output;

并使用键获取值

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

答案 2 :(得分:0)

经过一天的捣乱之后,我想出来了。谢谢你们所有的精彩反馈。问题是数据库表中的主机。我已经添加了http://它只是在寻找url.com而不是http://url.com