C# WinForms - SQL Server Compact Edition:不支持关键字:初始目录

Posted

技术标签:

【中文标题】C# WinForms - SQL Server Compact Edition:不支持关键字:初始目录【英文标题】:C# WinForms - SQL Server Compact Edition : keyword not supported : initial catalog 【发布时间】:2015-07-15 15:31:28 【问题描述】:

我想从数据库服务器 (SQL Server 2012) 获取数据以将我得到的内容写入本地数据库 (SQL Server Compact Edition 4.0 - WinForms 应用程序 - VS 2013)

通过代码创建.SDF数据库文件->ok。 打开到.SDF 文件的本地连接-> 确定。

通过代码创建表 -> 好的。

打开与数据库服务器的连接 -> 不正常! :(

我收到此错误消息:

System.ArgumentException:不支持关键字:“初始目录”

这是我的代码:

class mysqlCeEngine

    private const string LOCAL_SDF_FILE = "LocalDB.sdf";
    private const string LOCAL_CONN_STRING = "Data Source='|DataDirectory|LocalDB.sdf'; LCID=1033; Password=3C670F044A; Encrypt=TRUE;";
    private const string SOURCE_CONN_STRING = "Data Source=SQL\\SERVER;Initial Catalog=myDB;Integrated Security=True;Pooling=False;

    public static void CreateDB()
    
        if (File.Exists(LOCAL_SDF_FILE))
        
            File.Delete(LOCAL_SDF_FILE);
        

        SqlCeEngine engine = new SqlCeEngine(LOCAL_CONN_STRING);
        engine.CreateDatabase();
        engine.Dispose();

        SqlCeConnection localCnx = null;

        try
        
            localCnx = new SqlCeConnection(LOCAL_CONN_STRING);
            localCnx.Open();

            SqlCeCommand localCmd = localCnx.CreateCommand();

            #region CREATE TABLE t_Address
            localCmd.CommandText = @"CREATE TABLE t_Address(
                                    Address_ID int IDENTITY(1,1) NOT NULL,
                                    Address_Main nvarchar(4000) NULL,
                                    Address_CityName nvarchar(50) NULL,
                                    Address_CityZipCode nvarchar(50) NULL,
                                    Address_CountryID int NULL,
                                    Address_CustomerID int NULL,
                                    Address_SiteID int NULL,
                                    Address_IsVisible bit NOT NULL,
                                 CONSTRAINT PK_t_AdressID PRIMARY KEY (Address_ID)
                                )";

            localCmd.ExecuteNonQuery();
            #endregion

            using (SqlCeConnection sourceCnx = new SqlCeConnection(SOURCE_CONN_STRING))
            
                try
                
                    sourceCnx.Open();

                    SqlCeCommand SourceCmd = sourceCnx.CreateCommand();
                    SourceCmd.CommandText = "SELECT * FROM t_Address";
                    SqlCeDataReader reader = SourceCmd.ExecuteReader();

                    using (SqlBulkCopy bulkCopy = new SqlBulkCopy(LOCAL_CONN_STRING))
                    
                        bulkCopy.DestinationTableName = "t.Address";

                        try
                        
                            // Write from the source (DB server) to the destination (local wibe)
                            bulkCopy.WriteToServer(reader);
                        
                        catch (Exception ex)
                        
                            MessageBox.Show(ex.ToString(), "An error occurred", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        
                        finally
                        
                            reader.Close();
                        
                    
                
                catch (Exception ex)
                
                    MessageBox.Show(ex.ToString(), "An error occurred", MessageBoxButtons.OK, MessageBoxIcon.Error);
                
                finally
                
                    sourceCnx.Close();
                
            
        
        catch(Exception ex)
        
            MessageBox.Show(ex.ToString(), "An error occurred", MessageBoxButtons.OK, MessageBoxIcon.Error);
        
        finally
        
            localCnx.Close();
        
    

我在网上做了一些搜索,发现我应该添加“ProviderName=System.Data.SqlClient”,但我仍然有这个问题。

我也尝试过使用 System.Data.Entity.Database 类方法“OpenConnectionString”,但它不起作用(VS 告诉我这个类不包含此方法的定义)。

我不知道该怎么做,虽然我正在尝试一些在这里和那里找到的东西。

谢谢,

地狱猫

【问题讨论】:

从连接字符串看来,你的source数据库是一个真正的Sql server实例。在这种情况下,您应该使用带有 SqlConnection 的 vanilla - SqlCe* 类型仅适用于您的本地 SqlCe 数据库。 天哪,没错!在寻找解决方案时我的眼睛在燃烧,但这只是一个错误> 【参考方案1】:

使用SOURCE_CONN_STRING完整 SQL Server 的连接必须使用SqlConnection - 而不是SqlCeConnection ...

所以改变这一行:

using (SqlCeConnection sourceCnx = new SqlCeConnection(SOURCE_CONN_STRING))

到:

using (SqlConnection sourceCnx = new SqlConnection(SOURCE_CONN_STRING))

在处理完整的 SQL Server 实例时使用SqlCommand(而不是SqlCeCommand)。

【讨论】:

是的,谢谢!但现在我的 SqlBulkCopy 不起作用。我得到一个“不支持的关键字:lcid”。是否有 SqlBulkCopy 的 CE 版本? 我找到了这个,如果有一天有人需要它:sqlcebulkcopy.codeplex.com 再次感谢!

以上是关于C# WinForms - SQL Server Compact Edition:不支持关键字:初始目录的主要内容,如果未能解决你的问题,请参考以下文章

未知计算机的 C# WinForms SQL Server Express(本地数据库)连接字符串

使用 c# winforms 将数据更新/保存到 SQL 数据库表

C# WinForms - DataGridView/SQL Compact - 主键列中的负整数

实体框架 + SQL Server Compact + WPF/WinForms = 缓慢的 UI?

Winforms / SQL Server应用程序的会计系统[关闭]

连接到 SQL Server 数据库 C#-WinForms