如果Windows应用程序中的Sql Compact 4文件共享错误

时间:2014-09-20 00:35:46

标签: sql-server sql-server-ce

我很抱歉,但我想得到最终答案。 首先我长时间使用SQL compact 3.5并且需要很长时间才能制作表格并且每个用户应用程序都能正常工作但是现在我有客户希望通过本地网络在8台计算机上运行我的软件所以我说好了然后我尝试在服务器上共享数据文件.sdf并使用它但我收到错误我不记得了所以我在互联网上搜索我看到我必须 update to SQL compact 4 所以更新它,然后我得到这个愚蠢的错误 我不能相信这些数据不支持这种类型的使用,并且在SQL压缩数据库上制作表和其他东西需要很长时间,我的客户不会等我,所以原因是什么 我的SQL语句是这样的:

dt = New SqlCeConnection("Data Source=" & dpaa & "\MoveData.sdf;Encrypt Database=True;Password=123cdswdaas;File Mode=Read Write;Persist Security Info=False")

2 个答案:

答案 0 :(得分:1)

我认为之前的回答有点误导 - 您绝对可以将 SQL Server CE 4.0 与位于网络共享上的数据库文件一起使用。事实上,我现在正在我的一个活跃项目中使用此功能。 "文件模式=独家"参数不是必需的 - 在这种情况下,独占模式是唯一可用的模式。

这种方法的主要缺点是,由于整个SDF文件的独占锁定,在给定时间只有一个客户端能够读取或写入数据库文件。但是在某种情况下,您的环境中无法使用功能齐全的SQL服务器(域策略等)。在这种情况下,共享数据库文件是唯一可用的解决方案。

答案 1 :(得分:0)

多个用户 is not supported访问网络共享上的SQL Compact数据库.sdf文件。您应该使用SQL Server Express版本。此主题上的stackoverflow上还有多个帖子。版本3.5支持从网络共享独占打开.sdf文件,但4.0不支持。但是没有SQL CE版本支持多个网络用户对1 .sdf文件的共享访问。

但升级您的应用程序以支持SQL Express和SQL Compact数据库可能相对容易。这取决于您的应用程序如何访问数据。例如,使用Entity Framework,您可以根据实际的数据库连接生成查询。

您还可以使用通用类DbConnectionDbCommand等代替SqlCeConnectionSqlCeCommand等 - 因此您可以更改已使用的数据库类型而无需维护两个单独版本的项目。


下载SQL Express 2014 with Tools SQLEXPRWT http://msdn.microsoft.com/cs-cz/evalcenter/dn434042.aspx。 (您最终也可以使用旧版本,例如2008)SQL Server具有比SQL CE更多的SQL功能和数据类型,因此请注意您只使用与SQL CE兼容的内容。

在app.config中,您可以拥有两个连接字符串:

<add name="CompactDBConnection" connectionString="data source=|DataDirectory|\CE.sdf; password=xxxxxx; SSCE:Max Buffer Size=16384; temp file max size=256; ssce:autoshrink threshold=100; ssce:max database size=4091" providerName="System.Data.SqlServerCe.4.0" />
<add name="ExpressDBConnection" connectionString="Server=myServerName\myInstanceName;Database=myDataBase;User Id=myUsername; Password=myPassword;" providerName="System.Data.SqlClient" />

您可以选择在应用启动时使用哪一个

要创建DbConnection,请检查此C# Retrieving correct DbConnection object by connection string

以下是使用DbCommand而不是SqlCeCommand调用存储过程的小示例:

            DbConnection dbConn = GetConnection(connStr); 
            DbProviderFactory sqlF = DbProviderFactories.GetFactory(dbConn);
            using (DbCommand b2bcmd = sqlF.CreateCommand())
            {
                DbParameter msg = sqlF.CreateParameter();
                msg.ParameterName = "@errorMessage";
                msg.Direction = ParameterDirection.Output;
                msg.DbType = DbType.String;
                msg.Value = string.Empty;
                msg.Size = 2048;                                        

                b2bcmd.Connection = dbConn;
                b2bcmd.CommandType = CommandType.StoredProcedure;
                b2bcmd.CommandText = "PB2BImport";
                b2bcmd.Parameters.Add(msg);
                b2bcmd.ExecuteNonQuery();

                result = Convert.IsDBNull(msg.Value) ? "N/A" : (string)msg.Value;
            }

我认为你不使用实体框架 - 但用它会更容易。

相关问题