为啥数据表在c#中填充错误的列
Posted
技术标签:
【中文标题】为啥数据表在c#中填充错误的列【英文标题】:Why Data Table Filling Wrong Column in c#为什么数据表在c#中填充错误的列 【发布时间】:2020-04-16 13:54:37 【问题描述】:我正在创建一个数据表并填充它的列,如下所示
var dt = new DataTable();
dt.Columns.Add("TraceId", typeof(string));
dt.Columns.Add("TransactionId", typeof(string));
dt.Columns.Add("TransactionDate", typeof(string));
dt.Columns.Add("Amount", typeof(Int64));
dt.Columns.Add("SenderName", typeof(string));
dt.Columns.Add("SenderIban", typeof(string));
dt.Columns.Add("SenderBank", typeof(string));
dt.Columns.Add("ReceiverIban", typeof(string));
dt.Columns.Add("ReceiverName", typeof(string));
dt.Columns.Add("Comment", typeof(string));
dt.Columns.Add("PayaCycle", typeof(string));
dt.Columns.Add("CycleTime", typeof(string));
dt.Columns.Add("PayId", typeof(string));
dt.Columns.Add("ReturnCausality", typeof(string));
dt.Columns.Add("ReturnId", typeof(string));
dt.Columns.Add("Rejected", typeof(string));
dt.Columns.Add("AdDate", typeof(string));
然后我创建一个新行并按以下方式填充其列
foreach (var item in transactions)
DataRow row = dt.NewRow();
row["TraceId"] = item.traceId;
row["TransactionId"] = item.transactionId;
row["TransactionDate"] = item.transactionDate;
row["SenderName"] = item.senderName;
row["SenderIban"] = item.senderIban;
row["SenderBank"] = item.senderBank;
row["Amount"] = Convert.ToInt64(item.amount);
row["ReceiverIban"] = item.receiverIban;
row["ReceiverName"] = item.receiverName;
row["Comment"] = item.comment;
row["PayaCycle"] = item.payaCycle;
row["CycleTime"] = item.cycleTime;
row["PayId"] = item.payId;
row["ReturnCausality"] = item.returnCausality;
row["ReturnId"] = item.returnId;
row["Rejected"] = item.rejected;
row["AdDate"] = item.adDate;
dt.Rows.Add(row);
然后将其传递给我的程序
using (var conn = new SqlConnection(_ConnString))
using (var cmd = conn.CreateCommand())
conn.Open();
cmd.CommandText = "---------";
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@InquiryTable", dt);
cmd.ExecuteNonQuery();
你也可以看到我的程序
CREATE PROCEDURE [dbo].[spUpdateRequestFromKarizInquiry_V2]
@InquiryTable AS [dbo].[PayaInquiryResult] READONLY
AS
BEGIN
--Just For Test
SELECT * INTO A_Res
FROM @InquiryTable
END
当我从A_Res
中选择时,您可以看到前三列的值错误,似乎它们的值在它们之间交换了......!
顺便说一句,我很确定我的 Transaction 对象对于我在上面设置的这些字段具有正确的值。
你也可以看到我的表类型结构
CREATE TYPE [dbo].[PayaInquiryResult] AS TABLE(
[TransactionId] [VARCHAR](100) NULL,
[TransactionDate] [VARCHAR](30) NULL,
[TraceId] [VARCHAR](30) NULL,
[Amount] [BIGINT] NULL,
[SenderName] [NVARCHAR](50) NULL,
[SenderIban] [VARCHAR](30) NULL,
[SenderBank] [NVARCHAR](20) NULL,
[ReceiverIban] [VARCHAR](30) NULL,
[ReceiverName] [NVARCHAR](30) NULL,
[Comment] [VARCHAR](MAX) NULL,
[PayaCycle] [NVARCHAR](20) NULL,
[CycleTime] [VARCHAR](20) NULL,
[PayId] [VARCHAR](50) NULL,
[ReturnCausality] [NVARCHAR](10) NULL,
[ReturnId] [VARCHAR](10) NULL,
[Rejected] [VARCHAR](10) NULL,
[AdDate] [VARCHAR](30) NULL
)
【问题讨论】:
您的创建类型有:TransactionId、TransactionDate、TraceId。而你的 DataTable 有 TraceId、TransactionId、TransactionDate。 我正在按列名而不是索引填充... 您正在传递一个 DataTable 并且 DataTable 中的行的顺序正在填充数据库表。 【参考方案1】:我终于发现我的错误在哪里。 我应该完全根据我在 sql 中的表类型结构添加列。感谢@jdweng
var dt = new DataTable();
dt.Columns.Add("TransactionId", typeof(string));
dt.Columns.Add("TransactionDate", typeof(string));
dt.Columns.Add("TraceId", typeof(string));
dt.Columns.Add("Amount", typeof(Int64));
dt.Columns.Add("SenderName", typeof(string));
dt.Columns.Add("SenderIban", typeof(string));
dt.Columns.Add("SenderBank", typeof(string));
dt.Columns.Add("ReceiverIban", typeof(string));
dt.Columns.Add("ReceiverName", typeof(string));
dt.Columns.Add("Comment", typeof(string));
dt.Columns.Add("PayaCycle", typeof(string));
dt.Columns.Add("CycleTime", typeof(string));
dt.Columns.Add("PayId", typeof(string));
dt.Columns.Add("ReturnCausality", typeof(string));
dt.Columns.Add("ReturnId", typeof(string));
dt.Columns.Add("Rejected", typeof(string));
dt.Columns.Add("AdDate", typeof(string));
我应该尊重列索引
【讨论】:
以上是关于为啥数据表在c#中填充错误的列的主要内容,如果未能解决你的问题,请参考以下文章
解密 C# 中使用 RSA-OAEP 在 JavaScript 中加密的数据时出现 OAEP 填充错误
当我使用 DefaultTableModel 从 CachedRowSet 填充 jTable 时,为啥 JTable 的列标题没有更新?