Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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# } 私有静态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

Ok),您编写的新函数可以正常工作,但我仍然会得到一个“竞争条件”,然后引发异常。因此在代码的这一部分:

        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
                }
            }
        }