C# } 私有静态void OpenCSVasDBWithLock(字符串fullFileName,操作dataRowProcessor) { string file=Path.GetFileName(fullFileName); string dir=Path.GetDirectoryName(fullFileName); string cStr=“Provider=Microsoft.Jet.OLEDB.4.0;” +“数据源=\”“+dir+”\\\”;” +“扩展属性=\”文本;HDR=是;FMT=分隔\“;”; string sqlStr=“从[“+文件+”]中选择*”; 使用(OLEDB连接连接=新OLEDB连接(cStr)) { OleDbCommand cmd=新的OleDbCommand(sqlStr,conn); conn.Open(); 使用(OleDbDataReader=cmd.ExecuteReader()) { while(reader.Read()) { 数据处理机(读卡器); } } } } 私有静态void VerifyFileLockedByOleDB(字符串fullFileName) { string file=Path.GetFileName(fullFileName); string dir=Path.GetDirectoryName(fullFileName); string cStr=“Provider=Microsoft.Jet.OLEDB.4.0;” +“数据源=\”“+dir+”\\\”;” +“扩展属性=\”文本;HDR=是;FMT=分隔\“;”; string sqlStr=“从[“+文件+”]中选择*”; 使用(OLEDB连接连接=新OLEDB连接(cStr)) { OleDbCommand cmd=新的OleDbCommand(sqlStr,conn); conn.Open(); 使用(OleDbDataReader=cmd.ExecuteReader()) { File.OpenRead(fullFileName);//应引发异常 while(reader.Read()) { File.OpenRead(fullFileName);//应引发异常 StringBuilder b=新的StringBuilder(); 对于(int i=0;i
Ok),您编写的新函数可以正常工作,但我仍然会得到一个“竞争条件”,然后引发异常。因此在代码的这一部分:C# } 私有静态void OpenCSVasDBWithLock(字符串fullFileName,操作dataRowProcessor) { string file=Path.GetFileName(fullFileName); string dir=Path.GetDirectoryName(fullFileName); string cStr=“Provider=Microsoft.Jet.OLEDB.4.0;” +“数据源=\”“+dir+”\\\”;” +“扩展属性=\”文本;HDR=是;FMT=分隔\“;”; string sqlStr=“从[“+文件+”]中选择*”; 使用(OLEDB连接连接=新OLEDB连接(cStr)) { OleDbCommand cmd=新的OleDbCommand(sqlStr,conn); conn.Open(); 使用(OleDbDataReader=cmd.ExecuteReader()) { while(reader.Read()) { 数据处理机(读卡器); } } } } 私有静态void VerifyFileLockedByOleDB(字符串fullFileName) { string file=Path.GetFileName(fullFileName); string dir=Path.GetDirectoryName(fullFileName); string cStr=“Provider=Microsoft.Jet.OLEDB.4.0;” +“数据源=\”“+dir+”\\\”;” +“扩展属性=\”文本;HDR=是;FMT=分隔\“;”; string sqlStr=“从[“+文件+”]中选择*”; 使用(OLEDB连接连接=新OLEDB连接(cStr)) { OleDbCommand cmd=新的OleDbCommand(sqlStr,conn); conn.Open(); 使用(OleDbDataReader=cmd.ExecuteReader()) { File.OpenRead(fullFileName);//应引发异常 while(reader.Read()) { File.OpenRead(fullFileName);//应引发异常 StringBuilder b=新的StringBuilder(); 对于(int i=0;i,c#,csv,locking,oledb,C#,Csv,Locking,Oledb,Ok),您编写的新函数可以正常工作,但我仍然会得到一个“竞争条件”,然后引发异常。因此在代码的这一部分: using (OleDbConnection conn = new OleDbConnection(cStr)) { OleDbCommand cmd = new OleDbCommand(sqlStr, conn); conn.Open(); using (OleDbDataReader
using (OleDbConnection conn = new OleDbConnection(cStr))
{
OleDbCommand cmd = new OleDbCommand(sqlStr, conn);
conn.Open();
using (OleDbDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
reader.GetString(0); // breakpoint here
}
}
}
我在注释“breakpoint here”的行上放置了一个断点,然后运行程序。然后我在文件资源管理器中找到了CSV文件,并尝试用Excel打开它。这会导致Excel等待文件解锁,这很好
但糟糕的是,当我清除断点,然后告诉它继续调试时,Excel潜入,抓住文件上的锁,并在我运行的代码中导致异常
(例外情况是:Microsoft Jet数据库引擎无法打开文件“”。该文件已由其他用户以独占方式打开,或者您需要查看其数据的权限。)
我想我总是可以将代码包装在try-catch块中,但是当异常发生时,我不知道它是合法的异常还是由这种奇怪的情况引起的异常
当读取器完成读取时,似乎会发生异常。(在读取器读取最后一行之后,但仍然处于“using(OleDbDataReader=cmd.ExecuteReader())”循环中。Ok,因此OleDbDataAdapter.Fill()在一个动作中打开、锁定、填充、释放锁定和关闭。我以前不理解这一点,但现在它有了意义。我如何将数据获取到DataTable对象中?(顺便提一下,我发现CSV文件不是我项目的方式,因为我也需要更新行,不幸的是,CSV文件只能选择和插入。)您好,Ranger-我扩展了上面的答案,以涵盖您的问题,即如何获得一个数据表,该数据表在您处理数据的整个过程中仍然锁定连接。好的,我稍后将查看此信息并返回给您。感谢您的帮助!好的,我尝试粘贴您的OpenCSVasDBWithLock()方法,它确实打开/填充数据表,但它肯定不会锁定文件。我可以启动应用程序的第二个副本并打开同一个文件。类似地,我可以转到目录并通过notepad.exe读取文件——我停止了对应用程序第一个实例的调试,它声称OleDbConn我不知道该怎么做…嗯,你确实发现了一个奇怪的现象。我现在正在更新我的答案。大约5分钟后见上文。
string cStr = "Provider=Microsoft.Jet.OLEDB.4.0;"
+ "Data Source=\"" + dir + "\\\";"
+ "Extended Properties=\"text;HDR=Yes;FMT=Delimited\";"
+ "Jet OLEDB:Database Locking Mode=0";
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.OleDb;
using System.Data;
using System.IO;
namespace TextFileLocking
{
class Program
{
private static DataTable OpenCSVasDB(string fullFileName)
{
string file = Path.GetFileName(fullFileName);
string dir = Path.GetDirectoryName(fullFileName);
string cStr = "Provider=Microsoft.Jet.OLEDB.4.0;"
+ "Data Source=\"" + dir + "\\\";"
+ "Extended Properties=\"text;HDR=Yes;FMT=Delimited\";";
string sqlStr = "SELECT * FROM [" + file + "]";
OleDbDataAdapter da;
DataTable dt = new DataTable();
try
{
da = new OleDbDataAdapter(sqlStr, cStr);
da.Fill(dt);
}
catch { dt = null; }
return dt;
}
private static DataTable OpenCSVasDBWithLockWontWork(string fullFileName, out OleDbDataReader reader)
{
string file = Path.GetFileName(fullFileName);
string dir = Path.GetDirectoryName(fullFileName);
string cStr = "Provider=Microsoft.Jet.OLEDB.4.0;"
+ "Data Source=\"" + dir + "\\\";"
+ "Extended Properties=\"text;HDR=Yes;FMT=Delimited\";";
string sqlStr = "SELECT * FROM [" + file + "]";
OleDbConnection openConnection = new OleDbConnection(cStr);
reader = null;
DataTable dt = new DataTable();
try
{
openConnection.Open();
OleDbCommand cmd = new OleDbCommand(sqlStr, openConnection);
reader = cmd.ExecuteReader();
dt.Load (reader); // this will close the reader and unlock the file!
return dt;
}
catch
{
return null;
}
}
private static void OpenCSVasDBWithLock(string fullFileName, Action<IDataReader> dataRowProcessor)
{
string file = Path.GetFileName(fullFileName);
string dir = Path.GetDirectoryName(fullFileName);
string cStr = "Provider=Microsoft.Jet.OLEDB.4.0;"
+ "Data Source=\"" + dir + "\\\";"
+ "Extended Properties=\"text;HDR=Yes;FMT=Delimited\";";
string sqlStr = "SELECT * FROM [" + file + "]";
using (OleDbConnection conn = new OleDbConnection(cStr))
{
OleDbCommand cmd = new OleDbCommand(sqlStr, conn);
conn.Open();
using (OleDbDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
dataRowProcessor(reader);
}
}
}
}
private static void VerifyFileLockedByOleDB(string fullFileName)
{
string file = Path.GetFileName(fullFileName);
string dir = Path.GetDirectoryName(fullFileName);
string cStr = "Provider=Microsoft.Jet.OLEDB.4.0;"
+ "Data Source=\"" + dir + "\\\";"
+ "Extended Properties=\"text;HDR=Yes;FMT=Delimited\";";
string sqlStr = "SELECT * FROM [" + file + "]";
using (OleDbConnection conn = new OleDbConnection(cStr))
{
OleDbCommand cmd = new OleDbCommand(sqlStr, conn);
conn.Open();
using (OleDbDataReader reader = cmd.ExecuteReader())
{
File.OpenRead(fullFileName); // should throw an exception
while (reader.Read())
{
File.OpenRead(fullFileName); // should throw an exception
StringBuilder b = new StringBuilder();
for (int i = 0; i < reader.FieldCount; i++)
{
b.Append(reader.GetValue(i));
b.Append(",");
}
string line = b.ToString().Substring(0, b.Length - 1);
Console.WriteLine(line);
}
}
}
}
static void Main(string[] args)
{
string filename = Directory.GetCurrentDirectory() + "\\SomeText.CSV";
try
{
VerifyFileLockedByOleDB(filename);
}
catch { } // ignore exception due to locked file
OpenCSVasDBWithLock(filename, delegate(IDataReader row)
{
StringBuilder b = new StringBuilder();
for (int i = 0; i <row.FieldCount; i++)
{
b.Append(row[i].ToString());
b.Append(",");
}
string line = b.ToString().Substring(0, b.Length - 1);
Console.WriteLine(line);
});
}
}
}
using (OleDbConnection conn = new OleDbConnection(cStr))
{
OleDbCommand cmd = new OleDbCommand(sqlStr, conn);
conn.Open();
using (OleDbDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
reader.GetString(0); // breakpoint here
}
}
}