我有一个ASP.NET应用程序,它将Datatable传递给Web服务,然后从Web服务传递到SQL Server存储过程。当我将Web应用程序和Web服务发布到服务器并运行时,它会失败。当我从指向服务器上的Web服务的本地主机运行应用程序时,它工作正常。当我从localhost运行Web应用程序和Web服务时,它可以正常工作。
我做了一些故障排除,看到以下行是问题,但我不确定如何解决:
cmdCommit.Parameters.AddWithValue(@SourceTable, dtSource);
当我评论上面的一行时,一切正常。当我用字符串数据类型替换上面一行中DataTable
(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;
}
令人困惑的部分是,当我从localhost运行Web应用程序并引用服务器上的Web服务时,它可以正常工作。当我从服务器运行Web应用程序时,我不明白为什么它会失败。
当我评论引用DataTable的行时,一切正常。
我尝试了以下但仍然没有成功:
SqlParameter tvpParam cmdCommit.Parameters.AddWithValue "@SourceTable", dtSource);
tvpParam.SqlDbType = SqlDbType.Structured;
tvpParam.TypeName = "dbo.SourceTableType";
此外,Web方法不会抛出异常。
答案 0 :(得分:1)
假设你已经在做这些:
Function
传递给存储过程(例如DataTable
)。然后,您可以使用SqlDbType.Structured
将@SourceTable
内容作为存储过程参数传递,如下所示:
DataTable
替代cmdCommitChange.Parameters.Add("@SourceTable", SqlDbType.Structured).Value = dtSource;
:
AddWithValue
cmdCommitChange.Parameters.AddWithValue("@SourceTable", dtSource).SqlDbType = SqlDbType.Structured;
块中的用法示例:
SqlConnection
参考:
答案 1 :(得分:0)
我发现了问题。我传递的文本值对于我的数据表上的列来说太大了。
Web服务确实引发了异常,但是我的应用程序中有一些代码阻止我看到它。