【问题标题】:executing a sql script from C# results in an error从 C# 执行 sql 脚本会导致错误
【发布时间】:2014-05-20 05:40:00
【问题描述】:

我有这个类,我正在尝试从以下位置执行我的脚本:

using System;
using System.Data.SqlClient;
using System.IO;
using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer.Management.Smo;
using SSS.ServicesConfig.MiscClasses;

namespace SSS.ServicesConfig.sqlchanges
{
  internal static class ExecuteScript
  {
    public static Status Execute(SqlConnection con, string scripttoexecute)
    {
      var status = new Status();
      try
      {
        var file = new FileInfo(scripttoexecute);
        var script = file.OpenText().ReadToEnd();
        var server = new Server(new ServerConnection(con));
        server.ConnectionContext.ExecuteNonQuery(script);
        file.OpenText().Close();
        status.IsSuccess = true;
        status.Message = "Success!";
        return status;
      }
      catch (Exception ex)
      {
        status.Message = ex.Message;
        status.IsSuccess = false;
        return status;
      }
    }
  }
}

它正在执行一个由 SSMS 创建的 sql 脚本,我在项目中设置为每次都复制它。

我收到这条消息:

混合模式程序集是针对版本“v2.0.50727”构建的 运行时并且不能在没有额外的 4.0 运行时加载 配置信息。

我检查了我的每一个项目,它们都在使用 .Net Framework 4。我在这一行收到这条消息:

server.ConnectionContext.ExecuteNonQuery(script);

是不是说我的 .sql 文件不是 .Net 4.0 文件?我不确定我是否理解这也指的是运行 2.0。

有什么想法吗?

编辑#1

如果有帮助,这是我的 .sql 文件的开头。我可以发布整个内容,但它真的很基础,只需创建一些表格:

USE [master]
GO
/****** Object:  Database [SuburbanPps]    Script Date: 4/7/2014 2:00:12 PM ******/
IF NOT EXISTS (SELECT name FROM sys.databases WHERE name = N'SuburbanPps')
BEGIN
CREATE DATABASE [SuburbanPps] ON  PRIMARY 
( NAME = N'SuburbanPps', SIZE = 2048KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
 LOG ON 
( NAME = N'SuburbanPps_log', SIZE = 2048KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
END

GO
ALTER DATABASE [SuburbanPps] SET COMPATIBILITY_LEVEL = 100
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [SuburbanPps].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO
ALTER DATABASE [SuburbanPps] SET ANSI_NULL_DEFAULT OFF 
GO
ALTER DATABASE [SuburbanPps] SET ANSI_NULLS OFF 
GO
ALTER DATABASE [SuburbanPps] SET ANSI_PADDING OFF 
GO
ALTER DATABASE [SuburbanPps] SET ANSI_WARNINGS OFF 
GO
ALTER DATABASE [SuburbanPps] SET ARITHABORT OFF 
GO

编辑#2

我相信是Microsoft.SqlServer.ConnectionInfo,因为它的版本是v2.0.50727,与上面的版本匹配。

编辑#3

好的,我对此感到困惑。我本来以为,当我添加Microsoft.SqlServer.ConnectionInfo 时,我正在添加.Net 4.0 版本,如下图所示:

这不正确吗?如果不需要,我宁愿在安装我的应用程序时不需要两个不同的框架。或者……我真的对发生的事情感到困惑吗?

这不只是一种解决方法,而不是真正解决问题吗:

<startup useLegacyV2RuntimeActivationPolicy="true">

【问题讨论】:

  • 好像和你的sql脚本一点关系都没有。
  • 我不认为它会......我只是不明白它指的是什么。
  • 这看起来像您的一个组件运行的框架与其他组件不同,也许您的 sql server 驱动程序不是最新的。
  • 您的解决方案中可能有多个项目,并且它们针对不同的 .NET 运行时版本。那,或者你指的是一个已编译的程序集。

标签: c# sql winforms executenonquery


【解决方案1】:

混合模式组装?这是一个 ASP.Net 应用程序吗?

如果是这样,此问题已被多次回答和解决。对 Web.config 稍作改动即可。

<startup useLegacyV2RuntimeActivationPolicy="true">
  <supportedRuntime version="v4.0"/>
</startup>

Ref

【讨论】:

  • 我已经编辑了我的帖子并添加了 Edit#3 作为回应。这是一个 winforms 应用程序。
  • 我过去在控制台应用程序中遇到过这个问题,这与我在那里所做的相同。
  • 很高兴知道,我的大部分工作都在众所周知的“云”中,所以它的所有 ASP 都在房子的 .NET 端。整体解决方案是将所有引用的库升级到 v4.0。 Microsoft.SqlServer.ConnectionInfo 如果您在识别 4.0 版本而不是 2.0 版本时遇到问题,您可能希望将此资源本地复制到项目中。过去,我在使用 Visual Studio 处理同一资源的不同版本时遇到过问题。
  • The overall solution would be to bring all referenced libraries up to v4.0. 这正是我想要找出的。我将尝试将其复制到项目中,看看效果如何。
猜你喜欢
  • 1970-01-01
  • 2014-09-03
  • 1970-01-01
  • 1970-01-01
  • 2017-05-18
  • 2014-06-05
  • 1970-01-01
  • 2019-12-10
  • 2013-02-10
相关资源
最近更新 更多