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

时间:2018-04-06 04:20:54

标签: asp.net sql-server datatable

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

我做了一些故障排除,看到以下行是问题,但我不确定如何解决:

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

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

以下是整个Web方法,我在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;
}

令人困惑的部分是,当我从localhost运行Web应用程序并引用服务器上的Web服务时,它可以正常工作。当我从服务器运行Web应用程序时,我不明白为什么它会失败。

当我评论引用DataTable的行时,一切正常。

我尝试了以下但仍然没有成功:

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

此外,Web方法不会抛出异常。

2 个答案:

答案 0 :(得分:1)

假设你已经在做这些:

  1. 在数据库中的用户定义表类型中定义表类型(通常称为TVP,请参阅下面的参考部分);
  2. 添加参数以将Function传递给存储过程(例如DataTable)。
  3. 然后,您可以使用SqlDbType.Structured@SourceTable内容作为存储过程参数传递,如下所示:

    DataTable

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

    AddWithValue

    cmdCommitChange.Parameters.AddWithValue("@SourceTable", dtSource).SqlDbType = SqlDbType.Structured; 块中的用法示例:

    SqlConnection

    参考:

    Table-Valued Parameters (MS Docs)

答案 1 :(得分:0)

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

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