2

在 datagridview 中调整内容后,我正在尝试将数据写回到 Unidata 上的文件中。

我已经尝试了基于以下代码的各种选项,但没有运气。

在 foreach 部分中,我想更新我的文件。该文件由 10 个单值属性组成。

我尝试了 fl.write(),但收到与写入空值有关的错误...

     try
        {
            DataTable modifiedTable = m_DS.Tables[0].GetChanges(DataRowState.Modified);
            if (modifiedTable.Rows.Count > 0)
            {
                U2Connection con = GetConnection();
                Console.WriteLine("Connected.................");
                UniSession lUniSession = con.UniSession;
                UniFile fl = lUniSession.CreateUniFile("myTableName");
                UniDynArray udr3 = new UniDynArray(lUniSession);

                foreach (DataRow item in modifiedTable.Rows)
                {

                }
                con.Close();
             }
        }
4

2 回答 2

3

感谢您使用 UniObjects 的 U2 Toolkit for .NET(以前称为独立 UO.NET)的 API。

昨天(2014 年 6 月 10 日),我们发布了 U2 Toolkit for .NET v2.1.0。U2 Toolkit for .NET v2.1.0 的主要特点是

  • 本机 Visual Studio 集成

有关其他功能,请参阅此链接 http://blog.rocketsoftware.com/2014/05/access-nosql-data-using-sql-syntax-u2-toolkit-net-v2-1-0-beta/

您能否使用 SELECT 和 UPDATE 尝试相同的代码(10 个单值属性)。供您参考,SELECT 和 UPDATE 在后台调用 UniFile Read 和 Write。这些示例是安装的一部分。转到这些目录。

C:\Program Files (x86)\Rocket Software\U2 Toolkit for .NET\U2 Database Provider\samples\C#\UniData\NativeAccess\Select_SQL_Syntax

C:\Program Files (x86)\Rocket Software\U2 Toolkit for .NET\U2 Database Provider\samples\C#\UniData\NativeAccess\Update_SQL_Syntax

选择

private static void Select()
    {
        try
        {
            Console.WriteLine(Environment.NewLine + "Start...");
            ConnectionStringSettingsCollection settings = ConfigurationManager.ConnectionStrings;
            ConnectionStringSettings cs = settings["u2_connection"];
            U2Connection lConn = new U2Connection();
            lConn.ConnectionString = cs.ConnectionString;
            lConn.Open();
            Console.WriteLine("Connected...");
            U2Command cmd = lConn.CreateCommand();

            //ID,FNAME,LNAME : Single Value
            //SEMESTER: Multi Value
            //COURSE_NBR,COURSE_GRD: MS


            cmd.CommandText = string.Format("SELECT ID,FNAME,LNAME,SEMESTER,COURSE_NBR,COURSE_GRD FROM STUDENT WHERE ID > 0 ORDER BY ID");

            U2DataAdapter da = new U2DataAdapter(cmd);
            DataSet ds = new DataSet();
            da.Fill(ds);
            Console.WriteLine(Environment.NewLine);
            ds.WriteXml(Console.Out);
            lConn.Close();
            Console.WriteLine(Environment.NewLine + "End...");
            Console.WriteLine(SUCCESS_MSG);

        }
        catch (Exception e2)
        {
            string lErr = e2.Message;
            if (e2.InnerException != null)
            {
                lErr += lErr + e2.InnerException.Message;
            }
            Console.WriteLine(Environment.NewLine + lErr);
            Console.WriteLine(FAIL_MSG);
        }
    }

更新

private static void Update_Using_DataSet()
    {
        try
        {
            Console.WriteLine(Environment.NewLine + "Start...");
            ConnectionStringSettingsCollection settings = ConfigurationManager.ConnectionStrings;
            ConnectionStringSettings cs = settings["u2_connection"];
            U2Connection lConn = new U2Connection();
            lConn.ConnectionString = cs.ConnectionString;
            lConn.Open();
            Console.WriteLine("Connected...");
            U2Command cmd = lConn.CreateCommand();

            //ID,FNAME,LNAME : Single Value
            //SEMESTER: Multi Value
            //COURSE_NBR,COURSE_GRD: MS


            cmd.CommandText = string.Format("SELECT ID,FNAME,LNAME,SEMESTER,COURSE_NBR,COURSE_GRD FROM STUDENT WHERE ID={0} ORDER BY ID",ID);

            U2DataAdapter da = new U2DataAdapter(cmd);
            U2CommandBuilder builder = new U2CommandBuilder(da);
            da.UpdateCommand = builder.GetUpdateCommand();

            DataSet ds = new DataSet();
            da.Fill(ds);

            DataTable dt = ds.Tables[0];
            DataRowCollection lDataRowCollection = dt.Rows;
            int i = 1;
            foreach (DataRow item in lDataRowCollection)
            {
                item["FNAME"] = item["FNAME"] + "3";// modify single value
                item["SEMESTER"] = item["SEMESTER"] + "$";//modify multi-value
                item["COURSE_GRD"] = item["COURSE_GRD"] + "$";

                i++;

            }
            da.Update(ds);//use DataAdapter's Update() API

            //print modified value
            cmd.CommandText = string.Format("SELECT ID,FNAME,LNAME,SEMESTER,COURSE_NBR,COURSE_GRD FROM STUDENT WHERE ID={0} ORDER BY ID", ID); ;

            //verify the change
            U2DataAdapter da2 = new U2DataAdapter(cmd);
            DataSet ds2 = new DataSet();
            da2.Fill(ds2);
            Console.WriteLine(Environment.NewLine);
            ds2.WriteXml(Console.Out);

            //close connection
            lConn.Close();
            Console.WriteLine(Environment.NewLine + "End...");

            Console.WriteLine(SUCCESS_MSG);
        }
        catch (Exception e2)
        {
            Console.WriteLine(FAIL_MSG);
            string lErr = e2.Message;
            if (e2.InnerException != null)
            {
                lErr += lErr + e2.InnerException.Message;
            }
            Console.WriteLine(Environment.NewLine + lErr);
        }
    }
于 2014-06-12T15:17:11.627 回答
2

您需要为表中的每一行值修改 UniDynArray(记录),然后将 UniDynArray 写入文件和特定记录 ID:

for (Int32 i=0; i < modifiedTable.Rows.Count; i++)
{
    DataRow item = modifiedTable.Rows[i];
    //Modify each attribute in the record from the rows in the table
    udr3.Replace(i+1, (String)item[0]);
}
//Write the modified record to the file
fl.Write("MyRecordId", udr3);

fl.RecordId你得到空引用异常的原因是你没有fl.Record在调用fl.Write(). 正如您在上面看到的,我更喜欢使用 Write 方法的重载,该方法将记录 id 和记录数据作为参数,而不是在 UniFile 的实例上设置属性。

于 2014-06-11T17:59:12.300 回答