相关疑难解决方法(0)

使用C#中的流读取大型文本文件

我有一个很好的任务,就是如何处理大型文件被加载到我们应用程序的脚本编辑器中(就像我们用于快速宏的内部产品的VBA一样).大多数文件大约300-400 KB,这是很好的加载.但是当它们超过100 MB时,这个过程很难(正如你所期望的那样).

发生的事情是将文件读取并推入RichTextBox然后导航 - 不要过于担心这部分.

编写初始代码的开发人员只是使用StreamReader并且正在执行

[Reader].ReadToEnd()
Run Code Online (Sandbox Code Playgroud)

这可能需要很长时间才能完成.

我的任务是打破这段代码,将其以块的形式读入缓冲区并显示一个带有取消选项的进度条.

一些假设:

  • 大多数文件将是30-40 MB
  • 文件的内容是文本(非二进制),有些是Unix格式,有些是DOS.
  • 一旦检索到内容,我们就可以找出使用的终结符.
  • 一旦加载了在richtextbox中渲染所需的时间,没有人会担心.这只是文本的初始加载.

现在提问:

  • 我可以简单地使用StreamReader,然后检查Length属性(so ProgressMax)并为set缓冲区大小发出Read并在后台worker 中的while循环WHILST中迭代,这样它就不会阻塞主UI线程?然后在完成后将stringbuilder返回到主线程.
  • 内容将转到StringBuilder.如果长度可用,我可以用流的大小初始化StringBuilder吗?

这些(在您的专业意见中)是好主意吗?我过去曾经有一些问题从Streams读取内容,因为它总会错过最后几个字节或者其他东西,但如果是这样的话,我会问另一个问题.

.net c# stream streamreader large-files

89
推荐指数
9
解决办法
18万
查看次数

首先使用EF代码的唯一键

我的项目中有以下模型

public class Category
{   
    public Guid ID { get; set; }
    [Required(ErrorMessage = "Title cannot be empty")]
    public string Title { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

而我正在尝试制作一个Title独特的密钥,我搜索解决方案,但找不到任何.可以建议我怎么做,拜托?

c# unique-key ef-code-first entity-framework-4.1

62
推荐指数
2
解决办法
7万
查看次数

GO语句在.NET中炸毁sql执行

我有一个非常简单的C#命令shell应用程序,它执行SQL Server生成的sql脚本,用于脚本架构和数据.它正在吹嘘"GO"声明.错误信息:

'GO'附近的语法不正确.

这是完整的sql脚本:

/****** Object:  Table [gym].[MembershipStatus]    Script Date: 9/3/2013 9:24:01 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [gym].[MembershipStatus](
    [MembershipStatusID] [tinyint] IDENTITY(1,1) NOT NULL,
    [Name] [varchar](75) NOT NULL,
    [Description] [varchar](400) NOT NULL,
    [AllowCheckin] [bit] NOT NULL,
    [IncludeInCollections] [bit] NOT NULL,
    [ScheduleFutureInvoices] [bit] NOT NULL,
 CONSTRAINT [MembershipStatus_PK] PRIMARY KEY CLUSTERED 
(
    [MembershipStatusID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] …
Run Code Online (Sandbox Code Playgroud)

.net c# sql-server

33
推荐指数
4
解决办法
3万
查看次数

如何使用SqlConnection使用注释和GO语句执行SQL?

我似乎无法执行使用DbCommand对象创建数据库的SQL.我究竟做错了什么?这是我的代码:

DbConnection connection; // initialized and opened elsewhere
DbCommand cmd = connection.CreateCommand();
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)

这是错误:

查询语法无效.,在术语'/',第1行,第2列附近.说明:在执行当前Web请求期间发生了未处理的异常.请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息.

异常详细信息:System.Data.EntitySqlException:查询语法无效.,在术语'/',第1行,第2列附近.

这是文件的第一部分.仅针对第一行的注释抛出异常:

/****** Object:  Table [dbo].[User]    Script Date: 10/08/2009 12:14:29 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[User](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [FirstName] [nvarchar](50) NULL,
    [LastName] [nvarchar](50) NULL,
    [EmailAddress] [nvarchar](100) NULL,
 CONSTRAINT [PK_User] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY] …
Run Code Online (Sandbox Code Playgroud)

c# sql database

11
推荐指数
2
解决办法
1万
查看次数

改进/修复C样式块注释的正则表达式

我正在编写(在C#中)一个简单的解析器来处理一个看起来很像经典C的脚本语言.

在我拥有的一个脚本文件中,我用来识别/*阻止注释*/的正则表达式将进入某种无限循环,占用100%的CPU.

我正在使用的正则表达式是这样的:

/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/
Run Code Online (Sandbox Code Playgroud)

有关为什么会被锁定的任何建议?

或者,我可以使用的另一个正则表达式是什么?

更多信息:

  • 使用面向.NET 3.5的C#3.0;
  • 我正在使用Regex.Match(string,int)方法在字符串的特定索引处开始匹配;
  • 我让程序运行了一个多小时,但比赛没有完成;
  • 传递给Regex构造函数的选项是RegexOptions.MultilineRegexOptions.IgnorePatternWhitespace;
  • 正则表达式适用于我的453个测试文件中的452个.

c c# regex parsing comments

10
推荐指数
2
解决办法
7530
查看次数

在C#中执行包含GO语句的SQL批处理

我正在尝试构建一个程序,它在批处理中执行sql语句并进行错误处理(因此我没有使用SMO).

问题是GO不是SQL的一部分,当使用.NET执行语句时,它最终会出现错误(SMO会处理它,但不会指示执行是否失败).

string statements = File.ReadAllText("c:\\test.sql");
string[] splitted = statements.split("GO");
Run Code Online (Sandbox Code Playgroud)

使用上面的行不能解决我的问题,因为GO关键字也可以进入注释(我不想从语句中删除注释)并且注释可以进入/**/或在两个破折号之后-
例如,我不希望解析以下代码:

/*
GO
*/
Run Code Online (Sandbox Code Playgroud)

(ofc我谷歌搜索它,但那里没有解决方案)

.net c# sql sql-server

5
推荐指数
1
解决办法
2758
查看次数

在 C# 中使用 SMO 运行 SQL 脚本

我在程序中运行 SQL 脚本时遇到问题。这是程序的代码

        string databaseName = "TestDB";
        Server srv1 = new Server(@"TestServer/ABCUser");   // connects to default instance  
        srv1.ConnectionContext.LoginSecure = false;   // set to true for Windows Authentication  
        srv1.ConnectionContext.Login = "sa";
        srv1.ConnectionContext.Password = "abcde123*";
try
        {
            Console.WriteLine(srv1.Information.Version);   // connection is established  
            if(srv1.Databases[databaseName] == null)
            {
                Microsoft.SqlServer.Management.Smo.Database db;
                db = new Microsoft.SqlServer.Management.Smo.Database(srv1, databaseName);
                db.Create();
                db = srv1.Databases[databaseName];
                Console.WriteLine(db.CreateDate);
            }

            else
            {
                Console.WriteLine("DB Already Exists!");
            }
            string sqlScript = File.ReadAllText(@"D:\Projects\TrainingProject\src\TrainingDatabase\Scripts\Tables\Script01-table.sql");
            Console.WriteLine(sqlScript);
            srv1.ConnectionContext.ExecuteNonQuery(sqlScript);

        }
        catch (ConnectionFailureException e)
        {
            Console.WriteLine("Error in connecting to the sql …
Run Code Online (Sandbox Code Playgroud)

c# smo

4
推荐指数
1
解决办法
3666
查看次数

将大文本文件加载到字符串中

我想要将150 MB的文本文件加载到字符串中.该文件是UTF16编码的,因此它将生成一个内存大约150 MB的字符串.我尝试过的所有方法都会导致Out of Memory异常.

我知道这是一个巨大的字符串,当然不是我想做的事情.但是,目前我无能为力,没有对应用程序进行大量深刻更改即将出门.该文件中没有均匀分布的行集.一行可以包含整个文件大小的80%左右.

这是我尝试过的:

方法1

// Both of these throw Out of Memory exception
var s = File.ReadAllText(path)
var s = File.ReadAllText(path, Encoding.Unicode);
Run Code Online (Sandbox Code Playgroud)

方法2

var sb = new StringBuilder();

// I've also tried a few other iterations on this with other types of streams
using (FileStream fs = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
using (BufferedStream bs = new BufferedStream(fs))
using (StreamReader sr = new StreamReader(bs))
{
  string line;
  while ((line = sr.ReadLine()) != null)
  {
    sb.AppendLine(line);
  }
} …
Run Code Online (Sandbox Code Playgroud)

c# string file-handling

3
推荐指数
1
解决办法
3671
查看次数

来自 dotnet 的带有事务的 SQL 脚本

我一直在尝试从 dotnet (C#) 执行 sql 脚本,但 sql 脚本可能包含 GO 语句,我希望能够将脚本集合包装在事务中。

我发现了这个问题,接受的答案让我开始处理 GO 语句,但是如果我使用 BeginTransaction,它会在“new ServerConnection”行抛出InvalidOperationException 。

SqlConnection connection = new SqlConnection(connectionString);
connection.Open();
SqlTransaction transaction = connection.BeginTransaction(transactionName);
ServerConnection serverConnection = new ServerConnection(connection);
Run Code Online (Sandbox Code Playgroud)

我正在 SQL 2005 服务器上运行它。

.net sql sql-server ado.net transactions

2
推荐指数
1
解决办法
1917
查看次数

正则表达式删除单行SQL注释( - )

题:

任何人都可以给我一个可以从SQL语句中删除单行注释的正则表达式(C#/ VB.NET)吗?

我的意思是这些评论:

-- This is a comment
Run Code Online (Sandbox Code Playgroud)

不是那些

/* this is a comment */
Run Code Online (Sandbox Code Playgroud)

因为我已经可以处理明星评论了.

我有一个小的解析器,当它们在行的开头时删除那些注释,但是它们也可以在代码之后的某个地方或者更坏的情况下,在SQL字符串中'hello --Test -- World' 也应该删除那些注释(除了SQL字符串中的那些注释)当然 - 如果可能的话).

令人惊讶的是我没有使用正则表达式.我会认为明星评论更难,但实际上,他们不是.

根据请求,这里我的代码删除/**/ - 样式注释(为了让它忽略SQL样式字符串,你必须用uniqueidentifier替换字符串(我使用4个标准),然后应用注释删除,然后应用string-backsubstitution.

    static string RemoveCstyleComments(string strInput) 
    { 
        string strPattern = @"/[*][\w\d\s]+[*]/"; 
        //strPattern = @"/\*.*?\*/"; // Doesn't work 
        //strPattern = "/\\*.*?\\*/"; // Doesn't work 
        //strPattern = @"/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/ "; // Doesn't work 
        //strPattern = @"/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/ "; // Doesn't work 

        // http://stackoverflow.com/questions/462843/improving-fixing-a-regex-for-c-style-block-comments 
        strPattern = @"/\*(?>(?:(?>[^*]+)|\*(?!/))*)\*/";  // Works ! 

        string strOutput = System.Text.RegularExpressions.Regex.Replace(strInput, strPattern, string.Empty, System.Text.RegularExpressions.RegexOptions.Multiline); 
        Console.WriteLine(strOutput); …
Run Code Online (Sandbox Code Playgroud)

.net c# regex sql vb.net

2
推荐指数
1
解决办法
5701
查看次数

SQL查询参数

这很好用:

Query  = 'SELECT * from table_1 where code = :value; ';
Run Code Online (Sandbox Code Playgroud)

我然后尝试使用LIKE语句,它说它无法找到参数VALUE在这种情况下:

Query = 'SELECT * from table_1 where code LIKE ''%:value;%''';

Param := ADOQuery1.Parameters.ParamByName('value');
Param.DataType := ftString;
Param.Value := 'bob';
Run Code Online (Sandbox Code Playgroud)

我想使用反斜杠来忽略引号,因为它适用于大多数语言,但看起来它在Delphi中不起作用.

delphi

1
推荐指数
1
解决办法
1734
查看次数