【问题标题】:Visual Studio - This database cannot be importedVisual Studio - 无法导入此数据库
【发布时间】:2018-09-15 21:55:49
【问题描述】:

我正在尝试将条目插入到 Visual Studio 中的表中,但是在我运行代码然后尝试查看表后,我收到了此错误消息,

无法导入此数据库。它要么是不受支持的 SQL 服务器版本,要么是不受支持的数据库兼容性。

这是试图插入的代码,

private void doneButton_Click(object sender, EventArgs e) {
    string userName = userNameTextBox.Text,             
        password = passwordTextBox.Text,
        question = questionMenu.Text,
        answer = answerTextBox.Text;
        int key = EncryptionClass.generateKey();

    SqlConnection connection = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\MyData.mdf;Integrated Security=True");

    connection.Open();

    String sqlQuery = "INSERT INTO dbo.Account(UserName, UserPassword, UserKey) " +    
           "VALUES (\'" + userName + "\', \'" + EncryptionClass.encrypt(password, key) + "\', " + key + ");";

    Console.WriteLine("string " + sqlQuery);
    // INSERT INTO dbo.Account(UserName, UserPassword, UserKey) VALUES ('victoramaro', 'obvmhkT1', 19);

    using (SqlCommand command = new SqlCommand(sqlQuery, connection)) {
        try {
            var res = command.ExecuteNonQuery();
        } catch (SqlException ex) {
            Console.WriteLine(ex.Message);
        }
    }
        connection.Close();
}

还有 App.config,

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
    </configSections>
    <connectionStrings>
        <add name="Assign6.Properties.Settings.MyDataConnectionString"
            connectionString="Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\MyData.mdf;Integrated Security=True"
            providerName="System.Data.SqlClient" />   
    </connectionStrings>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
    </startup>
</configuration>

在 MyData.mdf 的属性中,构建操作设置为内容,复制到输出目录设置为复制(如果较新)。

在MyDataDataSet.xsd的属性中Build Action设置为None,Copy to Output Directory设置为Do not copy。

编辑

SqlConnection connection = new SqlConnection("Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\\MyData.mdf;Integrated Security=True");

connection.Open();


String sqlQuery = "INSERT INTO dbo.Account(UserName, UserPassword, UserKey) " +     //create insert query to insert user data into Account table
                        "VALUES (\'" + userName + "\', \'" + EncryptionClass.encrypt(password, key) + "\', " + key + ");";

using (SqlCommand command = new SqlCommand(sqlQuery, connection)) {
        try {
           command.ExecuteNonQuery();



            string selectStatement = "SELECT * FROM Account";

            SqlCommand selectCommand = new SqlCommand(selectStatement, connection);
            SqlDataReader sqlReader = selectCommand.ExecuteReader();             //execute the query 

            while (sqlReader.Read()) {                                         //while reader has data
                string outString = string.Empty;
                for (int k = 0; k < sqlReader.FieldCount; k++) {                //go throught the field count
                    outString += String.Format("{0, -8}", sqlReader[k]);        //add item to string
                }
                Console.WriteLine(outString);
            }

        }
        catch (SqlException ex) {
            throw ex;
        }
        finally {
            connection.Close();
        }
    }

【问题讨论】:

  • 总是使用参数来避免sql注入和格式化错误。
  • 你是如何创建/获得MyData.mdf的?
  • 项目 > 添加新项目 > 基于服务的数据库
  • 其他建议:始终使用 using 块和 SqlConnection 实例。此外,您应该只引用 app.config 中的连接字符串,不要将其硬编码到您的 .cs 文件中。
  • 你的主要是什么样子的?

标签: c# sql .net winforms visual-studio


【解决方案1】:

在这里

    SqlConnection connection = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\MyData.mdf;Integrated Security=True");

改成

    SqlConnection connection = new SqlConnection("Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\\MyData.mdf;Integrated Security=True");

或者像这样添加一个使用SqlConnentionStringBuilder的方法/函数

        public static SqlConnection GetConnection()
    {
        SqlConnectionStringBuilder connectionString = new SqlConnectionStringBuilder();
        connectionString.DataSource = "(localdb)\\MSSQLLocalDB";
        connectionString.AttachDBFilename = "|DataDirectory|\\MyData.mdf";
        connectionString.IntegratedSecurity = true;
        string connectString = connectionString.ConnectionString;

        SqlConnection connection = new SqlConnection(connectString);
        return connection;
    }

然后像这样调用方法

SqlConnection connection = GetConnection()

当你点击数据库时,你应该像这样尝试 catch finally

try
        {
            connection.Open();
            insertCommand.ExecuteNonQuery();
            string selectStatement =
                "SELECT IDENT_CURRENT('TableName') FROM TableName";
            SqlCommand selectCommand = new SqlCommand(selectStatement, connection);
            int vendorID = Convert.ToInt32(selectCommand.ExecuteScalar());
            return vendorID;
        }
        catch (SqlException ex)
        {
            throw ex;
        }
        catch (Exception ex)
        {
            throw ex;
        }
        finally
        {
            connection.Close();
        }

【讨论】:

  • @kevin 注意,如果你只是从app.config 拉取连接字符串,你就不用转义了\
  • 所以这消除了我收到的错误消息,但是当我尝试在服务器资源管理器中查看表格内容时,它是空的。
  • 我需要更多信息,你是如何显示表格的
  • 好的,我更新了我的代码以显示我目前正在尝试的内容。所以看起来当它到达ExecuteNonQuery 时,它正在插入数据。然后我在它之后运行一个 Select 命令,我输入的数据显示在控制台中,在多次运行程序后数据是持久的。但是当我进入服务器资源管理器查看表数据时,那里没有加载任何内容。
  • 最好使用ado.net的UI、BLL和DAL三层
【解决方案2】:

在服务器资源管理器部分查看本地数据库的属性并检查连接字符串属性,如下所示 - "Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\DELL\source\repos\WindowsFormsApp2\WindowsFormsApp2\CarDb.mdf;Integrated Security=True"

将其复制并粘贴到您的 program.cs 的连接字符串中

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    相关资源
    最近更新 更多