[英]Passing a datatable from C# Asp.Net website to SQL Server stored procedure
[英]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);
当我评论上面的行时,一切正常。 当我将上面一行中对DataTable
( dtSource
)的引用替换为字符串数据类型时,它可以工作。
这是整个网络方法,我在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方法不会引发异常。
假设您已经在执行以下操作:
DataTable
传递到存储过程(例如@SourceTable
)。 然后,您可以使用SqlDbType.Structured
将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;
}
参考:
我发现了问题。 我传递的文本值对于我的数据表中的列太大。
Web服务确实抛出了异常,但是我的应用程序例程中有一些代码阻止了我看到它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.