我正在尝试在SqlCe数据库(版本3.5,哦和使用C#3)中进行大量的批量插入.我已经尝试了各种方法(表适配器插入,准备参数化查询,sqlceresultset插入等).正如我在许多网站上看到的那样,最快的时间是在表直接模式下使用SqlCeResultSet对象.
我想通过在执行插入之前禁用必要表上的所有索引来进一步提高速度(之后我会重建它们).我有一个问题让ALTER INDEX语句工作(以前从未使用它,所以我确定我忽略了一些简单的事情).
基本上我已经创建了一个SqlCeCommandObject并以下面的方式设置了一个alter语句(Connection对象已经设置并且已经打开等):
.
.
.
SqlCeCommand disableIndexCommand = Connection.CreateCommand();
disableIndexCommand.CommandText = "ALTER INDEX ALL ON ItemMaster DISABLE";
disableIndexCommand.ExecuteNonQuery();
.
.
.
Run Code Online (Sandbox Code Playgroud)
当我尝试运行此代码时,我收到以下错误:
解析查询时出错.[令牌行号= 1,令牌行偏移= 7,令牌错误= INDEX]
听起来好像它不理解alter语句中的INDEX关键字.这在SqlCe中不受支持吗?
谢谢
[更新] - 我已经尝试过其他DDL语句(如DROP INDEX,CREATE INDEX),我似乎无法让它们中的任何一个工作?就DDL语句而言,我一直在寻找寻找SSCE中支持的内容和内容的列表.没运气.有没有人知道这方面的任何好资源.关于sqlce compact版本3.5的MS文档已经相当无用我必须说...
我的PC上安装了"SQL Server Compact 3.5 Service Pack 1"和"SQL Server Management Studio 2008"(SSMS).过去,我可以从SSMS中"连接到服务器"对话框的"服务器类型"列表中选择"SQL Server Compact Edition".此条目现在丢失,我无法恢复它.
我正在使用SQL Server,我想设置SQL Server CE数据库(*.sdf)的数据库密码.我找到了Command如何用密码创建一个新数据库:
CREATE DATABASE "secure.sdf"
DATABASEPASSWORD '<enterStrongPasswordHere>'
Run Code Online (Sandbox Code Playgroud)
但我想设置现有数据库的密码.
这究竟意味着什么?
我正在逐步完成一些代码,当我在vs2010的locals窗口下查看我的datareader的属性时,DR.HasRows显示错误:
HasRows '(DR).HasRows' threw an exception of type 'System.InvalidOperationException' bool {System.InvalidOperationException}
base {"SQL Server Compact does not support calls to HasRows property if the underlying cursor is not scrollable."} System.SystemException {System.InvalidOperationException}
Run Code Online (Sandbox Code Playgroud)
什么是光标,如何使其可滚动?:)
[回答]
感谢大家!解决以下问题的代码是:
SELECT ID
FROM Schedule
WHERE (SUBSTRING(Time, 1, 2) = DATEPART(hh, GETDATE()))
Run Code Online (Sandbox Code Playgroud)
如何在SQL Server CE中选择前两个字符?
例如:
+-----+-----------+------------+
+ Day + Time + ID +
+-----+-----------+------------+
+ 1 + 08:00:00 + A1 +
+ 1 + 09:00:00 + A2 +
+ 1 + 09:30:00 + A3 +
+ 1 + 10:15:00 + A4 +
+-----+-----------+------------+
Run Code Online (Sandbox Code Playgroud)
Time列是一种nvarchar类型.
然后,我想ID根据实际时间选择唯一的时间,就像只选择08部分一样08:00:00.我怎样才能做到这一点?
假设我有这样的陈述:
SELECT * FROM MyTable WHERE a = 1 or b = 2 and c = 3
Run Code Online (Sandbox Code Playgroud)
这是否意味着:(a = 1)OR(b = 2 AND c = 3)或它是否意味着(a = 1或b = 2)和c = 3?我可以改变它的含义,即在AND之前执行OR或者这是不可能的吗?
自从Entity Framework Code First可用以来,我一直在使用以下方法:
public virtual void CreateDatabase()
{
var dbContext = _dbContextLocator.Current;
dbContext.Database.Delete();
dbContext.Database.Create();
dbContext.Database.Initialize(true);
}
Run Code Online (Sandbox Code Playgroud)
最近,我注意到,当dbContext.Database.Create()被击中时,我得到以下异常:
发生System.Data.SqlServerCe.SqlCeException
Message =指定的表不存在.[__MigrationHistory]
Source = SQL Server Compact ADO.NET数据提供程序
ErrorCode = -2147467259
HResult = -2147217865
NativeError = 0
StackTrace:at System.Data.SqlServerCe.SqlCeCommand.ProcessResults(Int32 hr)
InnerException:
如果我转到Debug - Exceptions并检查Thrown是否存在"Common Language Runtime Exceptions",这会导致执行停止,并且我得到上述异常.如果我取消选中它,数据库似乎正确创建,但我在输出窗口中得到以下错误语句的四次重复:
类型"System.Data.SqlServerCe.SqlCeException"的第一次机会异常出现在System.Data.SqlServerCe.dll
类型的第一个机会异常"System.Data.SqlServerCe.SqlCeException"发生在System.Data.SqlServerCe.dll
第一System.Data.SqlServerCe.Entity.dll中发生类型'System.Data.SqlServerCe.SqlCeException'的
机会异常System.Data.Entity.dll中发生类型'System.Data.EntityCommandExecutionException'
的第一次机会异常第一次机会异常System.Data.Entity.dll中出现'System.Data.EntityCommandExecutionException'类型System.Data.Entity.dll中出现'System.Data.EntityCommandExecutionException'类型的
第一次机会异常
放置try/catch块dbContext.Database.Create()无效.
我的目标是创建一个完全空白的数据库,然后手动填充数据.我不希望使用Entity Framework的新迁移功能.
我该怎么做才能消除第一次机会异常?
entity-framework sql-server-ce ef-code-first ef-migrations entity-framework-4.3
我们有一个用Delphi 7编写的旧应用程序.它目前连接到一个正在退役的旧Oracle Lite数据库.相反,已选择将数据移动到Microsoft SQL Server Compact数据库的权限.在花费大量时间将所有内容移到SQL CE数据库之后,我现在的任务是让Delphi应用程序与新数据库一起使用.
应该比我聪明的人(我的老板)告诉我,我应该能够简单地修改连接,一切都应该恢复原状.但是,为了在Delphi应用程序中获取ADO连接以使用我们的新SQL CE数据库,我已经在我的监视器上敲了两天.
我正在使用的一个略微简化的例子:
连接是在一个名为"adoConn"的TADOConnection的全局对象中建立的:
procedure TGlobal.DataModuleCreate(Sender: TObject);
begin
adoConn.ConnectionString := 'Provider=Microsoft.SQLSERVER.CE.OLEDB.3.5;Data Source=path\db.sdf;';
adoConn.Connected := True;
end;
Run Code Online (Sandbox Code Playgroud)
在此之后不久,调用一个过程来填充一些消息.为了解决应用程序问题,我简化了代码以进行简单查询并在消息框中显示结果.该过程接收SQL字符串的参数,但我现在忽略它并手动插入一个简单的select语句:
procedure Select(const SQL: string);
var
adoQuery : TADOQuery;
begin
adoQuery := TADOQuery.Create(nil);
try
adoQuery.Connection := Global.adoConn;
adoQuery.SQL.Text := 'select * from CLT_MESSAGES';
adoQuery.ExecSQL;
While not adoQuery.Eof do
begin
// Here I just created a MessageDlg to output a couple of fields.
adoQuery.Next;
end;
finally
adoQuery.Free;
end;
end;
Run Code Online (Sandbox Code Playgroud)
一切都编译得很好,但是当我运行应用程序时,我收到以下错误:
"多步操作产生错误.检查每个状态值."
我做了一些额外的故障排除,发现错误发生在adoQuery.ExecSQL.我已经尝试了几种不同版本的连接字符串以及几种不同的尝试查询数据的方法,但最终都是一样的.我要么无法连接到数据库,要么我得到了那个愚蠢的"多重步骤"错误.
我提前感谢任何可以提供的帮助.
遗留代码以这种方式执行:
public bool isValidField(string tableName, string fieldName)
{
bool retVal;
string tblQuery = string.Format("SELECT {0} FROM {1}", fieldName, tableName);
checkConnection();
try
{
SqlCeCommand cmd = objCon.CreateCommand();
cmd.CommandText = tblQuery;
object objvalid = cmd.ExecuteScalar();
retVal = (null != objvalid);
}
catch
{
retVal = false;
}
return retVal;
}
Run Code Online (Sandbox Code Playgroud)
...但我发现它并不总是有效.调用该方法后,获取false,一些代码ALTERS表添加一些列,但我得到:
列ID在规范中出现多次.
我在StackOverflow上找到了几个有前途的SQL语句:
if exists(select * from sys.columns
where Name = N'columnName' and Object_ID = Object_ID(N'tableName'))
Run Code Online (Sandbox Code Playgroud)
和
IF COL_LENGTH('table_name','column_name') IS NULL
Run Code Online (Sandbox Code Playgroud)
...但我不确定如何在C#/ .NET 1.1中实现它
我是否需要使用ExecuteScalar并将返回的值转换为bool?或者是其他东西?
改变它并没有纠正问题:
public bool isValidField(string …Run Code Online (Sandbox Code Playgroud) 我一直在开发一个控制台应用程序(C#/ .Net Framework 4.0/VS2012).我创建了一个SQL Server Compact数据库(*.sdf)并添加了一个连接字符串:
<connectionStrings>
<add name="Dispatcher.Properties.Settings.FakeDataSetConnectionString"
connectionString="Data Source=|DataDirectory|\FakeDataSet.sdf"
providerName="Microsoft.SqlServerCe.Client.4.0" />
</connectionStrings>
Run Code Online (Sandbox Code Playgroud)
但是当我尝试执行以下代码时:
SqlConnection con = new SqlConnection();
con.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["Dispatcher.Properties.Settings.FakeDataSetConnectionString"].ToString();
con.Open();
Run Code Online (Sandbox Code Playgroud)
它在con.Open()中给出以下异常:
建立与SQL Server的连接时发生与网络相关或特定于实例的错误.服务器未找到或无法访问.验证实例名称是否正确,以及SQL Server是否配置为允许远程连接.(提供程序:SQL网络接口,错误:26 - 查找指定的服务器/实例时出错)
我在这里做错了什么?
SQL Server代理和SQL Server Browser都处于"已启动"状态.使用SQL Server Compact Edition时实际上是否重要?
sql-server-ce ×10
c# ×3
sql ×3
ddl ×1
delphi ×1
delphi-7 ×1
indexing ×1
sql-server ×1
ssms ×1
windows-ce ×1