我有一个大约300,000行和30列的表.我怎样才能快速清除它?如果我进行DROP FROM MyTable
查询,则需要很长时间才能运行.我正在尝试以下存储过程基本上创建没有数据的表的副本,删除原始表,并将新表重命名为原始表:
USE [myDatabase]
GO
SET ANSI_NULLS_ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[ClearTheTable]
AS
BEGIN
SET NOCOUNT ON;
SELECT * INTO tempMyTable FROM MyTable WHERE 1 = 0;
DROP TABLE MyTable
EXEC sp_rename tempMyTable, MyTable;
END
Run Code Online (Sandbox Code Playgroud)
这花了将近7分钟的时间.有更快的方法吗?我不需要任何记录,回滚或任何这种性质的东西.
如果重要,我将从C#应用程序调用存储过程.我想我可以写一些代码来做一个从头开始重新创建表DROP TABLE
,但我不想在添加或更改列时重新编译应用程序.
谢谢!
编辑
这是我更新的存储过程:
USE [myDatabase]
GO
SET ANSI_NULLS_ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[ClearTheTable]
AS
BEGIN
SET NOCOUNT ON;
ALTER DATABASE myDatabase
SET RESTRICTED_USER WITH ROLLBACK IMMEDIATE
TRUNCATE TABLE MyTable
ALTER DATABASE …
Run Code Online (Sandbox Code Playgroud) 我正在创建一个小应用程序,它读取制表符分隔的文本文件,进行一些更改,然后创建一个Excel 2007 .xlsx文件.我无法弄清楚如何从字符串数组中取出行并将它们写入Excel文件,使用选项卡将行分成列.我希望这是有道理的.
我有string Lines[]
这样的东西:
Item1\tItem2\tItem3\tItem4
ItemA\tItemB\tItemC\tItemD
Item5\tItem6\tItem7\tItem8
Run Code Online (Sandbox Code Playgroud)
我想创建一个如下所示的Excel文件:
A B C D
Item1 Item2 Item3 Item4
ItemA ItemB ItemC ItemD
Item5 Item6 Item7 Item8
Run Code Online (Sandbox Code Playgroud)
我尝试了以下方法,但它只是将第一行Lines[]
放入每一行,而不是分成列:
string Lines[] = GetLines();
Excel.Application xlApp;
Excel.Workbook xlWb;
Excel.Worksheet xlWs;
object misValue = System.Reflection.Missing.Value;
xlApp = new Excel.Application();
xlWb = xlApp.Workbooks.Add(misValue);
xlWs = (Excel.Worksheet)xlWb.Worksheets.get_Item(1);
Excel.Range c1 = (Excel.Range)xlWs.Cells[2, 1];
Excel.Range c2 = (Excel.Range)xlWs.Cells[2 + lines.Length, 1];
Excel.Range range = xlWs.get_Range(c1, c2);
range.Value = lines;
range.TextToColumns(
range,
Microsoft.Office.Interop.Excel.XlTextParsingType.xlDelimited,
Microsoft.Office.Interop.Excel.XlTextQualifier.xlTextQualifierNone,
false,
true …
Run Code Online (Sandbox Code Playgroud) 我有一个ANSI 835(文本)文件.为简单起见,它看起来像这样:
ISA*00
GS*Foo*12345
ST*835*000001
LX*1
CLP*123456
NM1*Lastname
REF*010101
DTM*20120512
SVC*393939
LQ*19
LX*2
CLP*23456
NM1*Smith
REF*58774
DTM*20120601
SVC*985146
LX*3
CLP*34567
NM1*Doe
REF*985432
DTM*20121102
SVC*864253
LQ*19
LQ*84
Run Code Online (Sandbox Code Playgroud)
记录分为LX段.LX*1之后的所有内容都是一条记录,LX*2之后的所有内容都是另一条记录,依此类推.我需要从每一行获取某些项目,将它们分配给变量,最后将它们作为一行添加到datagridview.为了简单起见,我还有以下变量,以下是每个变量:
string ItemNumber
应该是在CLP行中
string LastName
的*之后的字符组应该是在NM1行中
string Date
的*之后的字符组应该是在REF行中
string Error
的*之后的字符组应该是*之后的字符组中的字符组LQ线
我面临的最大问题是每个LX段可能有多个LQ线.在这种情况下,第二个错误可以添加到第一个错误的末尾,用逗号分隔.
我尝试将文件加载到一个字符串数组中并逐行进行,但我不确定如何说"从LX*1开始直到你点击LX*2".
string[] lines = File.ReadAllLines(MyFile);
foreach (string line in lines)
{
string[] splitline = line.Split('*');
if (splitline[0] = "LX")
{
//this is where i need to loop through the next lines
//until i hit the next line starting with LX. …
Run Code Online (Sandbox Code Playgroud) 我在Access中有一些VBA代码,它从Excel工作表中获取一系列单元格,然后将它们从数字转换为日期.例如,范围是H1:Y25000
Public Sub FixDates(theRange as Range)
Dim RangeCell as Range
For Each RangeCell In theRange
If IsNumeric(RangeCell.Value) And RangeCell.Value > 0 And Not IsEmpty(RangeCell.Value) Then
lngDate = CLng(RangeCell.Value)
RangeCell.Value = DateAdd("d", lngDate -1, "1/1/1968")
End If
Next RangeCell
End Sub
Run Code Online (Sandbox Code Playgroud)
代码似乎有效,但运行时间可能很长.这可以用不同的方式写得更快吗?我正在阅读使用Variant而不是Range,但我无法弄明白.
哦,打电话给Sub,我用的东西是:
path = "C:\myfile.xlsx"
Set xlApp = CreateObject("Excel.Application")
Set xlWbk = xlApp.Workbooks.Open(path)
Set xlWks = xlWbk.Worksheets(1)
lastRow = xlWks.Range("A1").End(xlDown).Row
FixDates (xlWks.Range("H1:Y" & lastRow))
Run Code Online (Sandbox Code Playgroud)
谢谢!
除非我尝试在参数中传递空值,否则我有这个查询似乎有效:
using (OleDbCommand com = new OleDbCommand("INSERT INTO [GROUP] ([Group Number], [Group Name], [Address 1], " +
" [Address 2], [City State Zip], [Phone], [Carrier Code], [Retail Plan Num 1], [Retail Plan Num 2], " +
" [Retail Plan Num 3], [Retail Plan Num 4], [Retail Plan Num 5], [Plan Start Date 1], [Plan Start Date 2], " +
" [Plan Start Date 3], [Plan Start Date 4], [Plan Start Date 5]" +
") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", con))
{
com.Parameters.Add("@p0", OleDbType.Char, …
Run Code Online (Sandbox Code Playgroud) 我的应用程序读取文本文件并填充ListView.这很简单,像这样:
Date | Invoice | Status
20121015 | 123123 |
20121015 | 123124 |
20121015 | 123456 |
20121015 | 124123 |
Run Code Online (Sandbox Code Playgroud)
然后,我需要读取第二个文本文件,该文件可能包含也可能不包含在ListView中找到的发票以及状态.如果存在匹配的发票,则需要将该第二个文本文件的状态添加到ListView中,使其如下所示:
Date | Invoice | Status
20121015 | 123123 |
20121015 | 123124 |
20121015 | 123456 | Paid
20121015 | 124123 |
Run Code Online (Sandbox Code Playgroud)
最初我有一个只有发票号码的ListBox,并且正在做
int index = ListBox1.FindString(<whatever>);
Run Code Online (Sandbox Code Playgroud)
获取包含发票的行的索引,然后删除项目(RemoveAt(索引))并插入新项目,如
ListBox.Items.Insert(index, invoice + " PAID")
Run Code Online (Sandbox Code Playgroud)
如何使用ListView执行类似操作?我喜欢有列而不只是1行文本的想法.我应该使用ListView以外的东西来实现这一目标吗?
平均而言,我正在阅读的每个文本文件都有<1000行需要添加.
我有一个包含2个工作表的Excel工作簿.我们称之为"物品清单"和"物品主数据".
在"项目列表"中,我有2列,B("代码")和C("子代码").它看起来像这样:
A B C
----------------
100 AR
110 AR
120 NU
130 AR
Run Code Online (Sandbox Code Playgroud)
在"项目主文件"中,我有类似的列,K("代码")和L("子代码").它看起来像这样:
E K L
----------------
xx 100 AR
xx 100 AR
xy 120 NU
xc 120 AR
xz 130 AR
Run Code Online (Sandbox Code Playgroud)
在"项目列表"中,我需要让列C显示"项目主文件"列E的值,如果B和C的值与K和L的值匹配.
因此,如果(项目列表)A AND(项目列表)B匹配(项目主文件)K AND(项目主文件)L,则(项目列表)C =(项目主文件)E
如果有多个匹配项,则搜索可以在第一个匹配项后停止并获取列E的值,因为它对于所有匹配项都是相同的.
如何才能做到这一点?
我的本地PC上有一个Access 2007数据库,网络上还有一个数据库。
本地:c:\ mydatabase.accdb网络:\ server \ share \ publicdatabase.accdb
这两个数据库有2个相同的表,让我们给他们打电话Table1
和Table2
我的过程涉及将数据从PICK数据库导出到定界文本文件,然后将其导入Access。
当前,我更新本地数据库中的表,然后在Access中将表从本地数据库复制/粘贴到网络数据库。我希望通过VBA做到这一点。
我发现以下代码将在网络数据库上用于清除表,然后“拉”更新,但是我需要从PC运行它以清除网络数据库表,然后“推”更新。
Dim AccessConn As New System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Test Files\database.mdb")
AccessConn.Open()
Dim AccessCommand As New System.Data.OleDb.OleDbCommand("DELETE * FROM [Catlog]", AccessConn)
AccessCommand.ExecuteNonQuery()
AccessCommand.CommandText = "INSERT INTO [Table1] SELECT * FROM [MS Access;DATABASE=C:\Test Files\database.mdb;].[Table1]"
AccessCommand.ExecuteNonQuery()
AccessConn.Close()
Run Code Online (Sandbox Code Playgroud)
另外,如果不是很麻烦,我该如何进行检查以首先确保可以更新网络数据库?(尚未由其他用户打开)
谢谢!!
编辑:到目前为止有效:
With Access.DoCmd
.RunSQL "Delete FROM Table1 IN '\\server\share\publicdatabase.accdb'"
.RunSQL "Insert INTO Table1 IN '\\server\share\publicdatabase.accdb' SELECT * FROM Table1"
End With
Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,我有以下行:
double val = Convert.ToDouble(values8[x]) + 24837;
Run Code Online (Sandbox Code Playgroud)
如果values8[x]
无法转换为Double
应用程序崩溃错误Input string was not in a correct format
.
如何测试这一点,并设置val
到DBNull.Value
如果转换失败?试试看?这样的事情会被接受吗?
编辑:这是我想要做的
try
{
double val = Convert.ToDouble(values8[x]) + 24837;
com.Parameters.Add("@p1", OleDbType.Date, 255).Value = DateTime.FromOADate(val);
}
catch (exception e)
{
com.Parameters.Add("@p1", OleDbType.Date, 255).Value = DBNull.Value;
}
Run Code Online (Sandbox Code Playgroud)
EDIT2:TryParse
我正在寻找.