繁体   English   中英

将数据表传递到SQL Server存储过程不起作用

[英]Passing datatable to SQL Server stored procedure not working

我有一个ASP.NET应用程序,该应用程序将Datatable传递给Web服务,然后从Web服务传递给SQL Server存储过程。 当我将Web应用程序和Web服务发布到服务器并运行时,它失败了。 当我从本地主机运行指向服务器上Web服务的应用程序时,它运行良好。 当我从本地主机运行Web应用程序和Web服务时,都可以正常工作。

我进行了一些故障排除,发现问题出在以下几行,但不确定如何解决:

cmdCommit.Parameters.AddWithValue(@SourceTable, dtSource);

当我评论上面的行时,一切正常。 当我将上面一行中对DataTabledtSource )的引用替换为字符串数据类型时,它可以工作。

这是整个网络方法,我在try / catch块中使用以下代码:

DataTable dtSource = ObjectToData(sourceTable);
dtSource.TableName = TableTypeObject;

using (SqlConnection cnn = new SqlConnection(_cnnSqlCapss))
{
    SqlCommand cmdCommitChange = new SqlCommand("usp_Stored_Procedure", cnn);
    cmdCommitChange.CommandType = CommandType.StoredProcedure;

    cmdCommitChange.Parameters.AddWithValue("@Parm1",  Value1);
    cmdCommitChange.Parameters.AddWithValue("@Parm2", Value2);
    cmdCommitChange.Parameters.AddWithValue("@Parm3", dtSource);

    var returnParameter = cmdCommitChange .Parameters.Add("@ReturnVal", SqlDbType.Int);

    returnParameter.Direction = ParameterDirection.ReturnValue;

    cnn.Open();
    cmdCommitChange .ExecuteNonQuery();

    var result = returnParameter.Value;
    return (int)result;
}

令人困惑的是,当我从本地主机运行Web应用程序并引用服务器上的Web服务时,它就可以工作。 从服务器运行Web应用程序时,我不明白为什么它会失败。

当我注释引用DataTable的行时,一切正常。

我已经尝试了以下方法,但仍然没有成功:

SqlParameter tvpParam cmdCommit.Parameters.AddWithValue "@SourceTable", dtSource);  
 tvpParam.SqlDbType = SqlDbType.Structured; 
 tvpParam.TypeName = "dbo.SourceTableType";

此外,Web方法不会引发异常。

假设您已经在执行以下操作:

  1. 在数据库的用户定义表类型中定义表类型(通常称为TVP,请参见下面的参考部分);
  2. 添加参数以将DataTable传递到存储过程(例如@SourceTable )。

然后,您可以使用SqlDbType.StructuredDataTable内容作为存储过程参数传递,如下所示:

cmdCommitChange.Parameters.Add("@SourceTable", SqlDbType.Structured).Value = dtSource;

AddWithValue替代:

cmdCommitChange.Parameters.AddWithValue("@SourceTable", dtSource).SqlDbType = SqlDbType.Structured;

SqlConnection块中的示例用法:

using (SqlConnection cnn = new SqlConnection(_cnnSqlCapss))
{
    SqlCommand cmdCommitChange = new SqlCommand("usp_Stored_Procedure", cnn);
    cmdCommitChange.CommandType = CommandType.StoredProcedure;

    cmdCommitChange.Parameters.AddWithValue("@Parm1", Value1);
    cmdCommitChange.Parameters.AddWithValue("@Parm2", Value2);
    cmdCommitChange.Parameters.AddWithValue("@Parm3", Value3);

    // add this line
    cmdCommitChange.Parameters.Add("@SourceTable", SqlDbType.Structured).Value = dtSource;

    cmdCommitChange.Parameters.Add("@ReturnVal", SqlDbType.Int).Direction = ParameterDirection.ReturnValue;

    cnn.Open();
    cmdCommitChange.ExecuteNonQuery();

    var result = (int)returnParameter.Value;
    return result;
}

参考:

表值参数(MS Docs)

我发现了问题。 我传递的文本值对于我的数据表中的列太大。

Web服务确实抛出了异常,但是我的应用程序例程中有一些代码阻止了我看到它。

暂无
暂无

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

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