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