为啥数据表在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 填充错误

在 C# 中比较两个数据表的列名

如何使单元格仅在填充后才能读取?数据网格视图 C#

C# 更改 DataGridView 中的列标题

为啥 SQL 浮点数与 C# 浮点数不同

当我使用 DefaultTableModel 从 CachedRowSet 填充 jTable 时,为啥 JTable 的列标题没有更新?