我正在从事的项目即将完成。我正在加载.MDB文件,在DataGrid上显示内容,并尝试在DataGrid上获取这些更改,然后将其保存回.MDB文件。我还将创建一个函数,使我可以从一个.MDB文件中获取表并将其保存到另一个.MDB文件中。当然,如果我不知道如何将更改保存回.MDB文件,则无法执行任何操作。
我已经对Google进行了广泛的研究,但我的问题没有答案。我认为自己是该特定主题的初学者,所以请不要使答案太复杂-我需要最简单的方法来编辑.MDB文件!请提供编程示例。
假设我已经建立了到DataGrid的连接。如何获得Datagrid所做的更改?我确定这一回答足够简单。
然后,我需要知道如何使用此数据表,将其插入来自它的数据集,然后采用该数据集并重写.MDB文件。 (如果有一种方法只能插入已更改的表,则我更愿意这样做。)
预先谢谢您,如果您需要更多信息,请告诉我。这是我可能要问的最后一件事……谢谢上帝。
编辑:
我正在使用的.mdb是Microsoft Access数据库。 (我什至不知道有多个.mdb文件)
我知道我无法通过流写入器或任何其他方法直接写入.MDB文件,但是有没有办法我可以生成其中已包含DataSet信息的.MDB文件?还是只有一种方法可以将表添加到已经加载到DataGrid的.MDB文件中。有办法!
同样,我需要一种在C#中以编程方式执行此操作的方法。
编辑:
好的,我的项目很大,但是我使用一个单独的类文件来处理所有数据库连接。我知道我的设计和来源确实很草率,但是可以完成工作。我只和我在互联网上找到的例子一样好。
记住,我只是以另一种形式连接到DataGrid。让我知道您是否需要Datagrid表单中的代码(但我不知道您为什么需要它)。 DatabaseHandling.cs处理2个.MDB文件。因此,您将在其中看到两个数据集。我将最终使用它从一个数据集中获取表并将其放入另一个数据集中。我只需要弄清楚如何将这些值BACK保存回.MDB文件。
反正有这样做吗?一定有办法...
编辑:
从我的研究和阅读中...我认为答案就在我的鼻子底下。使用“ Update()”命令。现在,尽管这可以确保实际上有一种简单的方法可以执行此操作,但我仍然面临这样的问题:我不懂如何使用此更新命令。
也许我可以这样设置:
Oledb.OledbConnection cn = new Oledb.OledbConnection();
cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Staff.mdb";
Oledb.OledbCommand cmd = new Oledb.OledbCommand(cn);
cmd.CommandText = "INSERT INTO Customers (FirstName, LastName) VALUES (@FirstName, @LastName)";
我认为可以这样做,但我不想手动插入任何内容。我想同时做这两个:
获取在Datagrid上更改的信息,并更新我从中获取的Access数据库文件(.mdb)
创建一个函数,使我可以从另一个Access数据库文件(.mdb)中获取表并将其替换为辅助Access数据库文件(.mdb)。这两个文件将使用完全相同的结构,但其中将包含不同的信息。
我希望有人为此提供答案...我的项目已经完成,等待的只是一个简单的答案。
再次感谢您。
编辑:
好...好消息。我想出了如何查询.mdb文件本身(我认为)。这是代码,由于我尝试使用sql命令而导致运行时错误,因此无法使用。这将带我下一个问题。
添加到DatabaseHandling.cs的新功能代码:
static public void performSynchronization(string table, string tableTwoLocation)
{
OleDbCommand cmdCopyTables = new OleDbCommand("INSERT INTO" + table + "SELECT * FROM [MS Access;" + tableTwoLocation + ";].[" + table + "]"); // This query generates runtime error
cmdCopyTables.Connection = dataconnectionA;
dataconnectionA.Open();
cmdCopyTables.ExecuteNonQuery();
dataconnectionA.Close();
}
如您所见,我实际上已经设法对连接本身执行了查询,我相信这是实际的Access .MDB文件。正如我所说,我在文件上执行的SQL查询无法正常工作,并且在使用时会产生运行时错误。
我尝试执行的命令应该从.MDB文件中获取一个表,然后覆盖另一个.MDB文件中相同类型的表。我在上面尝试的SQL命令试图直接从.mdb文件中获取表,然后将其直接放在另一个文件中-这不是我想要的。我想从.MDB文件中获取所有信息-将表放入数据表中,然后将所有数据表添加到数据集中(我已完成。)我想对两个.MDB文件执行此操作。一旦有了两个数据集,我想从每个数据集中取出特定的表,然后将它们添加到每个文件中,如下所示:
DataSetA >>>> ----- [添加表
(覆盖它们)] ----- >>>> DataSetB
DataSetB >>>> ----- [添加表
(覆盖它们)] ----- >>>> DataSetA
我想将这些数据集分别作为数据集,然后将它们放回它们来自的每个Access .MDB文件中。本质上保持两个数据库同步。
因此,我提出的问题是:
如何创建一个SQL查询,该查询将通过覆盖现有的相同名称的表将表添加到.MDB文件。该查询应该能够在运行时动态创建,并使用一个数组替换为我要添加的表名的变量。
如何获取Datagrid对DataTable所做的更改并将其放回DataTable(或DataSet)中,以便将其发送到.MDB文件?
我已尽力详细阐述...因为我认为我对问题的解释不是很好。现在这个问题已经太久了。我只是希望我能更好地解释这一点。 :[
编辑:
感谢下面的用户,我想我几乎找到了解决方法-关键字差不多。
这是下面我更新的DatabaseHandling.cs代码。我收到运行时错误“数据类型不匹配”。考虑到我试图将这些表复制到具有完全相同设置的另一个数据库中,我不知道这怎么可能。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.OleDb;
using System.Data;
using System.IO;
namespace LCR_ShepherdStaffupdater_1._0
{
public class DatabaseHandling
{
static DataTable datatableB = new DataTable();
static DataTable datatableA = new DataTable();
public static DataSet datasetA = new DataSet();
public static DataSet datasetB = new DataSet();
static OleDbDataAdapter adapterA = new OleDbDataAdapter();
static OleDbDataAdapter adapterB = new OleDbDataAdapter();
static string connectionstringA = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Settings.getfilelocationA();
static string connectionstringB = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Settings.getfilelocationB();
static OleDbConnection dataconnectionB = new OleDbConnection(connectionstringB);
static OleDbConnection dataconnectionA = new OleDbConnection(connectionstringA);
static DataTable tableListA;
static DataTable tableListB;
static public void addTableA(string table, bool addtoDataSet)
{
dataconnectionA.Open();
datatableA = new DataTable(table);
try
{
OleDbCommand commandselectA = new OleDbCommand("SELECT * FROM [" + table + "]", dataconnectionA);
adapterA.SelectCommand = commandselectA;
adapterA.Fill(datatableA);
}
catch
{
Logging.updateLog("Error: Tried to get " + table + " from DataSetA. Table doesn't exist!");
}
if (addtoDataSet == true)
{
datasetA.Tables.Add(datatableA);
Logging.updateLog("Added DataTableA: " + datatableA.TableName.ToString() + " Successfully!");
}
dataconnectionA.Close();
}
static public void addTableB(string table, bool addtoDataSet)
{
dataconnectionB.Open();
datatableB = new DataTable(table);
try
{
OleDbCommand commandselectB = new OleDbCommand("SELECT * FROM [" + table + "]", dataconnectionB);
adapterB.SelectCommand = commandselectB;
adapterB.Fill(datatableB);
}
catch
{
Logging.updateLog("Error: Tried to get " + table + " from DataSetB. Table doesn't exist!");
}
if (addtoDataSet == true)
{
datasetB.Tables.Add(datatableB);
Logging.updateLog("Added DataTableB: " + datatableB.TableName.ToString() + " Successfully!");
}
dataconnectionB.Close();
}
static public string[] getTablesA(string connectionString)
{
dataconnectionA.Open();
tableListA = dataconnectionA.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new Object[] { null, null, null, "TABLE" });
string[] stringTableListA = new string[tableListA.Rows.Count];
for (int i = 0; i < tableListA.Rows.Count; i++)
{
stringTableListA[i] = tableListA.Rows[i].ItemArray[2].ToString();
}
dataconnectionA.Close();
return stringTableListA;
}
static public string[] getTablesB(string connectionString)
{
dataconnectionB.Open();
tableListB = dataconnectionB.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new Object[] { null, null, null, "TABLE" });
string[] stringTableListB = new string[tableListB.Rows.Count];
for (int i = 0; i < tableListB.Rows.Count; i++)
{
stringTableListB[i] = tableListB.Rows[i].ItemArray[2].ToString();
}
dataconnectionB.Close();
return stringTableListB;
}
static public void createDataSet()
{
string[] tempA = getTablesA(connectionstringA);
string[] tempB = getTablesB(connectionstringB);
int percentage = 0;
int maximum = (tempA.Length + tempB.Length);
Logging.updateNotice("Loading Tables...");
for (int i = 0; i < tempA.Length ; i++)
{
if (!datasetA.Tables.Contains(tempA[i]))
{
addTableA(tempA[i], true);
percentage++;
Logging.loadStatus(percentage, maximum);
}
else
{
datasetA.Tables.Remove(tempA[i]);
addTableA(tempA[i], true);
percentage++;
Logging.loadStatus(percentage, maximum);
}
}
for (int i = 0; i < tempB.Length ; i++)
{
if (!datasetB.Tables.Contains(tempB[i]))
{
addTableB(tempB[i], true);
percentage++;
Logging.loadStatus(percentage, maximum);
}
else
{
datasetB.Tables.Remove(tempB[i]);
addTableB(tempB[i], true);
percentage++;
Logging.loadStatus(percentage, maximum);
}
}
}
static public DataTable getDataTableA()
{
datatableA = datasetA.Tables[Settings.textA];
return datatableA;
}
static public DataTable getDataTableB()
{
datatableB = datasetB.Tables[Settings.textB];
return datatableB;
}
static public DataSet getDataSetA()
{
return datasetA;
}
static public DataSet getDataSetB()
{
return datasetB;
}
static public void InitiateCopyProcessA()
{
DataSet tablesA;
tablesA = DatabaseHandling.getDataSetA();
foreach (DataTable table in tablesA.Tables)
{
CopyTable(table, connectionstringB);
}
}
public static void CopyTable(DataTable table, string connectionStringB)
{
var connectionB = new OleDbConnection(connectionStringB);
foreach (DataRow row in table.Rows)
{
InsertRow(row, table.Columns, table.TableName, connectionB);
}
}
public static void InsertRow(DataRow row, DataColumnCollection columns, string table, OleDbConnection connection)
{
var columnNames = new List<string>();
var values = new List<string>();
for (int i = 0; i < columns.Count; i++)
{
columnNames.Add("[" + columns[i].ColumnName + "]");
values.Add("'" + row[i].ToString().Replace("'", "''") + "'");
}
string sql = string.Format("INSERT INTO {0} ({1}) VALUES ({2})",
table,
string.Join(", ", columnNames.ToArray()),
string.Join(", ", values.ToArray())
);
ExecuteNonQuery(sql, connection);
}
public static void ExecuteNonQuery(string sql, OleDbConnection conn)
{
if (conn == null)
throw new ArgumentNullException("conn");
ConnectionState prevState = ConnectionState.Closed;
var command = new OleDbCommand(sql, conn);
try
{
prevState = conn.State;
if (prevState != ConnectionState.Open)
conn.Open();
command.ExecuteNonQuery(); // !!! Runtime-Error: Data type mismatch in criteria expression. !!!
}
finally
{
if (conn.State != ConnectionState.Closed
&& prevState != ConnectionState.Open)
conn.Close();
}
}
}
}
为什么会出现此错误?这两个表完全相同。我究竟做错了什么?
最坏的情况是,如何在插入另一个具有相同值的完全相同的结构表之前删除另一个Access .MDB文件中的表?
老兄,我希望我能弄清楚这一点...
编辑:
好吧,我走了一段距离。我的问题演变成一个新的问题,因此值得单独提出。我已经回答了我的问题,因为现在我知道如何直接对打开的连接执行查询。谢谢你们!
参考方案
我不确定您走了多远,但是如果您想进行快速的拖放操作,则可能需要查看创建一个连接的强类型数据集,并使用DataSources Tool Window的拖放功能。在Visual Studio中。
肯定有样本,但是您会想要的。
创建一个新的数据集
在服务器资源管理器中从数据连接树中拖放
创建一个新表格
从数据源工具中拖动表
窗体上的窗口。
瞧
更新:
首先,我不是100%理解您的问题。如果可以在访问文件之间创建一些最佳的LinkTable,则可以使用sql语句(例如“ INSERT INTO客户SELECT FirstName,LastName FROM File2.Customers”)在文件之间复制数据。如果不是那样,那么我认为您将不得不循环数据表并使用与上次编辑类似的INSERT语句手动插入记录。至于数据网格,您可能必须通过监视RowChanged事件(不确定确切的事件)来跟踪更改的内容,甚至在行更改时也执行插入/更新语句。
更新:
循环数据表,您将执行以下操作。未经测试。我刚刚再次对其进行了更新,以包括MakeValueDbReady函数。这也没有经过测试,我不确定我是否已经正确处理了所有案例甚至所有案例。您实际上必须调试sql语句,并确保其生成正确的值。每个数据库处理的值都是不同的。至少可以这样提取值解析。我还意识到,不必对TableName进行硬编码,您应该能够从DataTable的属性中获取它
void CopyTable(DataTable table, string connectionStringB)
{
var connectionB = new OleDbConnection(connectionStringB);
foreach(DataRow row in table.Rows)
{
InsertRow(row, table.Columns, table.TableName, connectionB);
}
}
public static void InsertRow(DataRow row, DataColumnCollection columns, string table, OleDbConnection connection)
{
var columnNames = new List<string>();
var values = new List<string>();
// generate the column and value names from the datacolumns
for(int i =0;i<columns.Count; i++)
{
columnNames.Add("[" + columns[i].ColumnName + "]");
// datatype mismatch should be fixed by this function
values.Add(MakeValueDbReady(row[i], columns[i].DataType));
}
// create the sql
string sql = string.Format("INSERT INTO {0} ({1}) VALUES ({2})",
table,
string.Join(", ", columnNames.ToArray()),
string.Join(", ", values.ToArray())
);
// debug the accuracy of the sql here and even copy into
// a new Query in Access to test
ExecuteNonQuery(sql, connection);
}
// as the name says we are going to check the datatype and format the value
// in the sql string based on the type that the database is expecting
public string MakeValueDbReady(object value, Type dataType)
{
if (value == null)
return null;
if (dataType == typeof(string))
{
return "'" + value.ToString().Replace("'", "''") + "'"
}
else if (dataType == typeof(DateTime))
{
return "#" + ((DateTime)value).ToString + "#"
}
else if (dataType == typeof(bool))
{
return ((bool)value) ? "1" : "0";
}
return value.ToString();
}
public static void ExecuteNonQuery(string sql, OleDbConnection conn)
{
if (conn == null)
throw new ArgumentNullException("conn");
ConnectionState prevState = ConnectionState.Closed;
var command = new OleDbCommand(sql, conn);
try
{
// the reason we are checking the prev state is for performance reasons
// later you might want to open the connection once for the a batch
// of say 500 rows or even wrap your connection in a transaction.
// we don't want to open and close 500 connections
prevState = conn.State;
if (prevState != ConnectionState.Open)
conn.Open();
command.ExecuteNonQuery();
}
finally
{
if (conn.State != ConnectionState.Closed
&& prevState != ConnectionState.Open)
conn.Close();
}
}
如何从php中获取datatables jQuery插件的json数据 - php我是PHP的新手,正在尝试使用Datatables jQuery插件。我知道我必须从.php文件中获取数据,然后在数据表中使用它,但是我似乎无法通过ajax将其传递给数据表。我设法从数据库中获取数据,并对其进行json编码,但是后来我不知道如何在我的index.php文件中调用它,并在其中显示它。我究竟做错了什么?这是我的代码:HTML(已编辑): <…
当回复有时是一个对象有时是一个数组时,如何在使用改造时解析JSON回复? - java我正在使用Retrofit来获取JSON答复。这是我实施的一部分-@GET("/api/report/list") Observable<Bills> listBill(@Query("employee_id") String employeeID); 而条例草案类是-public static class…
改造正在返回一个空的响应主体 - java我正在尝试使用Retrofit和Gson解析一些JSON。但是,我得到的响应机构是空的。当我尝试从对象中打印信息时,出现NullPointerException。我确保URL正确,并且我也确保POJO也正确。我正在使用jsonschema2pojo来帮助创建POJO类。这是我要解析的JSON{ "?xml": { "@versi…
jQuery发布不会将数据发布到ASP.NET API控制器 - javascript我有一次噩梦般的时间通过jquery post将数据发送到ASP.NET Controller。这是JSON.stringify之后的数据:[{"scheduleTaskID":"203","task":"Permit","baselineDate":…
在Android Studio中设计可滚动内容时应遵循的方法是什么? - java我正在约束布局中设计我的应用程序,并将其放置在“滚动视图”下。我想放置更多的Card Views,但是在xml文件的预览中没有放置空间。当布局已满时,我应该在哪里拖放Buttons,TextViews等?我已经处理了文本的滚动视图,但这是另外一回事。我知道我只能输入代码,但是当内容超出定义的屏幕尺寸时,我将无法看到我正在设计的内容时,我将很难这样做。(如果您…