gpt4 book ai didi

c# - SQL 插入 : Duplicate Key Value Specified?

转载 作者:行者123 更新时间:2023-11-30 14:56:46 24 4
gpt4 key购买 nike

我在 AS400 系统的 LIBRARY1.TRACKINGTABLE 中有一个跟踪表。该表有 5 个字段:

  1. SSN 9,0(例如 123456789)非空
  2. 日期 8,0(例如 20131202)非空
  3. TIME 6,0(例如 133000)非空
  4. PRINT_NEW Z(例如 2013-12-02-11.23.47.965000)(使用了 CURRENT_TIMESTAMP)非空
  5. PRINT_OLD Z(例如 2013-12-02-11.23.47.965000)(使用了 CURRENT_TIMESTAMP)可空

在我的应用程序中,在处理过程中,我会提示用户是否希望将处理后的文档提交到图像文件服务器。如果在对话框中单击"is",所有已处理的文档都会从 C: 中的本地文件夹移动到共享网络文件夹。

然后我有一个包含在已处理文档中的所有 SSN 的数组。对于数组中的每个 SSN,我调用一个名为 updateAddrChangHistory(ssn) 的函数来更新我的跟踪表:

            // PROMPT USER TO COMMIT
DialogResult dResult = MessageBox.Show("Mail Merge Completed. Individual Documents Saved to C:\\TEMP\\to fyi\\. \n\n Commit generated documents to NetFYI?", "Confirm Commit", MessageBoxButtons.YesNo);
if (dResult == DialogResult.Yes)
{
moveLocalToCommitFYI();

// If selected letter is New/Old Address Letter, and thus tracked in table LIBRARY.TRACKINGTABLE,
// update the tracking table using SSN's stored in SSNsArray.
if (cmbLetterType.SelectedIndex < 2)
{
// Now that user has "theoretically" printed and Commited the processed documents, update Change History Table
foreach (string ssn in SSNsArray)
{
if (ssn != null && ssn.Length > 0)
{
updateAddrChngHistory(ssn);
}
}
}
SSNsArray = new string[0]; // Clear the array for next processing
updatePrintedCntLabel();
}

然后根据处理的文档类型,我插入新记录(表示已打印新地址信)或更新记录(表示已为同一成员打印旧地址信)。

    public void updateAddrChngHistory(string SSN)
{
// Update/Modify Tracking Table
string formattedDate = dtpDate.Value.ToString("yyyyMMdd");
//string formattedTime = DateTime.Now.TimeOfDay.ToString("HHmmss");
string query = "";
switch (docType)
{
case "oldAddr":
query = "UPDATE LIBRARY.TRACKINGTABLE SET PRINT_OLD = CURRENT_TIMESTAMP WHERE SSN = " + SSN + " AND PRINT_OLD IS NULL";
break;
case "newAddr":
query = "INSERT INTO LIBRARY.TRACKINGTABLE (SSN, DATE, TIME, PRINT_NEW, PRINT_OLD) VALUES (" + SSN + ", " + formattedDate + ", " + System.DateTime.Now.ToString("HHmmss") + ", CURRENT_TIMESTAMP, NULL)";
break;
case "nameChg":

break;

case "nameChgWAR":

break;
}

mdl.InsertUpdateData(query);
// Close Connection
mdl.closeConn();
}

mdl.InsertUpdateDate() 是一个类文件函数:

namespace MergeDoc
{
public class MergeDocClassLibrary
{
OdbcConnection conn = new OdbcConnection();

public void InsertUpdateData(string query)
{
// PROD
string connString = "DRIVER=Client Access ODBC Driver (32-bit); SYSTEM=XX.XX.X.XX; UID=XYXYXYZ; PWD=YXZYXZY";
// DEV
//string connString = ""

OdbcCommand cmd = new OdbcCommand(query, conn);

// Set connection using connectionString
conn.ConnectionString = connString;
// Open Connection
conn.Open();
// Execute command and store in OBDC DataReader
cmd.ExecuteReader();
}
}
}

我的问题如下:

我的最终用户在虚拟机上。当他们运行应用程序时,假设处理 97 个新地址信函记录,其中 72 个将进入跟踪表。每次,在处理过程中的某个时刻,他们都会收到以下错误(在文档成功移动到图像服务器处理文件夹之后):

Duplicate Key Error

据我所知,这是源于我的 INSERT 语句。然而,我无法弄清楚的是,为什么有几条记录成功地进入了表格,然后突然间某些事情导致了这个错误。更令人沮丧的是,我似乎无法在自己的机器上复制错误(即使在清除跟踪表并处理与我的用户完全相同的记录时)。

有没有其他人遇到过这个错误?关于如何解决此问题的任何想法?

SSN 是处理后的 SSN,DATE 是从我的应用程序 datepicker 控件中选择的日期,TIME 是当前系统时间,print new 是当前日期时间。这四个字段都是 NON-NULL,应该共同创建一个完全唯一的值。

最佳答案

这段代码有很多问题

应该在打开之前测试打开的连接。

为什么要保持连接打开?

你可以使用一些错误陷阱
您将知道错误在那里,并且应该能够获得更多详细信息

您不应该使用 ExecuteReader() 进行更新或插入
更新或插入应该是一个 ExecuteNonQuery()

根据更新和插入语句,SSN 很可能是 PK
如果 docType 是 newAddr 而没有检查 SSN 是否存在,那么您似乎正在执行插入。

if(string.IsNullOrEmpty(query)) return;
try
{
OdbcCommand cmd = new OdbcCommand(query, conn);
conn.ConnectionString = connString;
conn.Open();
cmd.ExecuteReader();
}
catch (OdbcException Ex)
{
Debug.WriteLine(Ex.Message);
throw Ex;
}
finally
{ }

关于c# - SQL 插入 : Duplicate Key Value Specified?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22020851/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com