【发布时间】:2014-02-26 04:28:53
【问题描述】:
我在 LIBRARY1.TRACKINGTABLE 的 AS400 系统上有一个跟踪表。此表有 5 个字段:
- SSN 9,0(例如 123456789)非空
- DATE 8,0(例如 20131202)非空
- TIME 6,0(例如 133000)非空
- PRINT_NEW Z(例如 2013-12-02-11.23.47.965000)(使用 CURRENT_TIMESTAMP)非空
- PRINT_OLD Z(例如 2013-12-02-11.23.47.965000)(使用 CURRENT_TIMESTAMP)可空
在我的应用程序中,在处理过程中,我会提示用户是否希望将已处理的文档提交到图像文件服务器。如果在对话框中单击“是”,则所有已处理的文档都会从其在 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 条将进入跟踪表。每次,在处理的某个时刻,他们都会收到以下错误(文档成功移动到图像服务器处理文件夹之后):
据我所知,这源于我的 INSERT 语句。但是,我无法弄清楚的是,为什么有几条记录成功地进入了表中,然后突然之间发生了一些事情导致了这个错误。更令人沮丧的是,我似乎无法在我自己的机器上复制错误(即使在清除跟踪表并处理与我的用户完全相同的记录时)。
有没有其他人遇到过这个错误?有关如何解决此问题的任何想法?
SSN 是处理后的 SSN,DATE 是从我的应用程序日期选择器控件中选择的日期,TIME 是当前系统时间,print new 是当前日期时间。这四个字段都是非空的,应该一起创建一个完全唯一的值。
【问题讨论】:
-
SSN你是主键吗? -
我正在尝试检查。数据库管理员创建了该表,我不熟悉如何检查 AS400 表。我在 VS2012 中设置了连接。
标签: c# sql .net ibm-midrange