Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 将datatable传递到SQL Server存储过程不起作用_Asp.net_Sql Server_Datatable - Fatal编程技术网

Asp.net 将datatable传递到SQL Server存储过程不起作用

Asp.net 将datatable传递到SQL Server存储过程不起作用,asp.net,sql-server,datatable,Asp.net,Sql Server,Datatable,我有一个ASP.NET应用程序,它将数据表传递给web服务,然后从web服务传递给SQL Server存储过程。当我将web应用程序和web服务发布到服务器并运行时,它失败了。当我从指向服务器上web服务的本地主机运行应用程序时,它工作正常。当我从localhost运行web应用程序和web服务时,它工作得很好 我做了一些故障排除,发现以下几行是问题所在,但我不确定如何解决: cmdCommit.Parameters.AddWithValue(@SourceTable, dtSource);

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

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

cmdCommit.Parameters.AddWithValue(@SourceTable, dtSource);
当我评论上面这行时,一切都正常。当我用字符串数据类型替换上面一行中对
数据表的引用时(
dtSource
),它会起作用

这是整个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;
}
令人困惑的是,当我从本地主机运行web应用程序并引用服务器上的web服务时,它可以工作。我不明白为什么从服务器上运行web应用程序会失败

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

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

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

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

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

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

    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;
    }
    
    参考:


    我发现了这个问题。我传递的文本值对于datatable上的列来说太大


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

    什么是@SourceTable的DB字段类型?没有要传递datatable的SqlDbType。也就是说,您不能将datatable添加到SQL@parameter.SqlDbType.StructuredI,我正在做您提到的所有事情。