2017-04-24 64 views
2

我试图运行脚本任务,但它给我一个错误调用错误

在System.RuntimeMethodHandle.InvokeMethod(对象目标,对象[]参数,签名的签名,布尔构造函数) 的系统。在System.Reflection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags invokeAttr,Binder binder,Object []参数,CultureInfo culture) 在System中反射.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj,Object []参数,Object []参数) 。 RuntimeType.InvokeMember(String name,BindingFlags bindingFlags,Binder binder,Object target,Object [] providedArgs,ParameterModifier [] modifiers,CultureInfo culture,String [] namedParams) 在Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTATaskScriptingEngine.ExecuteScript()

下面是我在日志文件中执行

 using System; 
using System.Data; 
using Microsoft.SqlServer.Dts.Runtime; 
using System.Windows.Forms; 
using System.IO; 
using System.Data.OleDb; 
#endregion 

namespace ST_dc84f0f0b249439e95ab14b5ecae9d04 
{ 
    /// <summary> 
    /// ScriptMain is the entry point class of the script. Do not change the name, attributes, 
    /// or parent of this class. 
    /// </summary> 
    [Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute] 
    public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase 
    { 
     #region Help: Using Integration Services variables and parameters in a script 
     /* To use a variable in this script, first ensure that the variable has been added to 
     * either the list contained in the ReadOnlyVariables property or the list contained in 
     * the ReadWriteVariables property of this script task, according to whether or not your 
     * code needs to write to the variable. To add the variable, save this script, close this instance of 
     * Visual Studio, and update the ReadOnlyVariables and 
     * ReadWriteVariables properties in the Script Transformation Editor window. 
     * To use a parameter in this script, follow the same steps. Parameters are always read-only. 
     * 
     * Example of reading from a variable: 
     * DateTime startTime = (DateTime) Dts.Variables["System::StartTime"].Value; 
     * 
     * Example of writing to a variable: 
     * Dts.Variables["User::myStringVariable"].Value = "new value"; 
     * 
     * Example of reading from a package parameter: 
     * int batchId = (int) Dts.Variables["$Package::batchId"].Value; 
     * 
     * Example of reading from a project parameter: 
     * int batchId = (int) Dts.Variables["$Project::batchId"].Value; 
     * 
     * Example of reading from a sensitive project parameter: 
     * int batchId = (int) Dts.Variables["$Project::batchId"].GetSensitiveValue(); 
     * */ 

     #endregion 

     #region Help: Firing Integration Services events from a script 
     /* This script task can fire events for logging purposes. 
     * 
     * Example of firing an error event: 
     * Dts.Events.FireError(18, "Process Values", "Bad value", "", 0); 
     * 
     * Example of firing an information event: 
     * Dts.Events.FireInformation(3, "Process Values", "Processing has started", "", 0, ref fireAgain) 
     * 
     * Example of firing a warning event: 
     * Dts.Events.FireWarning(14, "Process Values", "No values received for input", "", 0); 
     * */ 
     #endregion 

     #region Help: Using Integration Services connection managers in a script 
     /* Some types of connection managers can be used in this script task. See the topic 
     * "Working with Connection Managers Programatically" for details. 
     * 
     * Example of using an ADO.Net connection manager: 
     * object rawConnection = Dts.Connections["Sales DB"].AcquireConnection(Dts.Transaction); 
     * SqlConnection myADONETConnection = (SqlConnection)rawConnection; 
     * //Use the connection in some code here, then release the connection 
     * Dts.Connections["Sales DB"].ReleaseConnection(rawConnection); 
     * 
     * Example of using a File connection manager 
     * object rawConnection = Dts.Connections["Prices.zip"].AcquireConnection(Dts.Transaction); 
     * string filePath = (string)rawConnection; 
     * //Use the connection in some code here, then release the connection 
     * Dts.Connections["Prices.zip"].ReleaseConnection(rawConnection); 
     * */ 
     #endregion 


     /// <summary> 
     /// This method is called when this script task executes in the control flow. 
     /// Before returning from this method, set the value of Dts.TaskResult to indicate success or failure. 
     /// To open Help, press F1. 
     /// </summary> 
     public void Main() 
     { 

      //Declare Variables 
      string SourceFolderPath = Dts.Variables["User::SourceFolderPath"].Value.ToString(); 
      string DestinationFolderPath = Dts.Variables["User::DestinationFolderPath"].Value.ToString(); 
      string FileExtension = Dts.Variables["User::FileExtension"].Value.ToString(); 
      string FileDelimiter = Dts.Variables["User::FileDelimiter"].Value.ToString(); 
      string CreateTableStatement = ""; 
      string ColumnList = ""; 

      //Reading file names one by one 
      string SourceDirectory = SourceFolderPath; 
      string[] fileEntries = Directory.GetFiles(SourceDirectory, "*" + FileExtension); 
      foreach (string fileName in fileEntries) 
      { 
       // do something with fileName 
       //MessageBox.Show(fileName); 

       //Read first line(Header) and prepare Create Statement for Excel Sheet 
       System.IO.StreamReader file = new System.IO.StreamReader(fileName); 
       string filenameonly = (((fileName.Replace(SourceDirectory, "")).Replace(FileExtension, "")).Replace("\\", "")); 
       CreateTableStatement = (" Create Table [" + filenameonly + "] ([" + file.ReadLine().Replace(FileDelimiter, "] Text,[")) + "] Text)"; 
       file.Close(); 
       //MessageBox.Show(CreateTableStatement.ToString()); 


       //Construct ConnectionString for Excel 
       string connstring = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + DestinationFolderPath + "\\" + filenameonly 
        + ";" + "Extended Properties=\"Excel 12.0 Xml;HDR=YES;\""; 
       OleDbConnection Excel_OLE_Con = new OleDbConnection(); 
       OleDbCommand Excel_OLE_Cmd = new OleDbCommand(); 



       //drop Excel file if exists 
       File.Delete(DestinationFolderPath + "\\" + filenameonly + ".xlsx"); 
       Excel_OLE_Con.ConnectionString = connstring; 
       Excel_OLE_Con.Open(); 
       Excel_OLE_Cmd.Connection = Excel_OLE_Con; 

       //Use OLE DB Connection and Create Excel Sheet 
       Excel_OLE_Cmd.CommandText = CreateTableStatement; 
       Excel_OLE_Cmd.ExecuteNonQuery(); 

       //Writing Data of File to Excel Sheet in Excel File 
       int counter = 0; 
       string line; 

       System.IO.StreamReader SourceFile = 
       new System.IO.StreamReader(fileName); 
       while ((line = SourceFile.ReadLine()) != null) 
       { 
        if (counter == 0) 
        { 
         ColumnList = "[" + line.Replace(FileDelimiter, "],[") + "]"; 

        } 
        else 
        { 
         string query = "Insert into [" + filenameonly + "] (" + ColumnList + ") VALUES('" + line.Replace(FileDelimiter, "','") + "')"; 
         // MessageBox.Show(query.ToString()); 
         var command = query; 
         Excel_OLE_Cmd.CommandText = command; 
         Excel_OLE_Cmd.ExecuteNonQuery(); 

        } 
        counter++; 
       } 
       Excel_OLE_Con.Close(); 
       SourceFile.Close(); 
       Dts.TaskResult = (int)ScriptResults.Success; 
      } 
     } 



     #region ScriptResults declaration 
     /// <summary> 
     /// This enum provides a convenient shorthand within the scope of this class for setting the 
     /// result of the script. 
     /// 
     /// This code was generated automatically. 
     /// </summary> 
     enum ScriptResults 
     { 
      Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success, 
      Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure 
     }; 
     #endregion 

    } 
} 

错误的脚本任务是

System.Data.OleDb.OleDbException(0x80004005):无法更新。 数据库或对象是只读的。在 System.Data.OleDb.OleDbConnectionInternal..ctor在 System.Data.OleDb.OleDbConnectionFactory.CreateConnection(OleDbConnectionString 构造,OleDbConnection的连接)(DbConnectionOptions 选项,DbConnectionPoolKey poolKey,对象poolGroupProviderInfo, 池类DBConnectionPool,的DbConnection owningObject)在 System.Data.ProviderBase.DbConnectionFactory.CreateConnection(DbConnectionOptions 选项,DbConnectionPoolKey poolKey,对象poolGroupProviderInfo, 池类DBConnectionPool,的DbConnection owningConnection, DbConnectionOptions USEROPTIONS)在 System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(的DbConnection owningConnect离子,DbConnectionPoolGroup poolGroup,DbConnectionOptions USEROPTIONS)在 System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(的DbConnection owningConnection,TaskCompletionSource1重试,DbConnectionOptions USEROPTIONS,DbConnectionInternal oldConnection,DbConnectionInternal & 连接)在 System.Data.ProviderBase.DbConnectionInternal。 TryOpenConnectionInternal(的DbConnection outerConnection,DbConnectionFactory connectionFactory的, TaskCompletionSource1重试,DbConnectionOptions USEROPTIONS)在 System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(的DbConnection outerConnection,DbConnectionFactory connectionFactory的, TaskCompletionSource1重试,DbConnectionOptions USEROPTIONS)处 System.Data.OleDb.OleDbConnection.Open() System.Data.ProviderBase.DbConnectionInternal.OpenConnection(的DbConnection outerConnection,DbConnectionFactory connectionFactory的)在 ST_95d12bd810fe43d993a0b7a913fec230.ScriptMain.Main()

+1

的问题是明确的'数据库或对象是只读的,only'和解决方案作为一个答案,为什么不[接受](HTTP:它是什么? – Yahfoufi

+1

对于迟到的回复,对不起哈迪。我出于工作目的而旅行。我非常感谢你的时间和帮助。谢谢! –

回答

1

从错误日志中它看起来像你的Excel文件是只读的。

System.Data.OleDb.OleDbException(0x80004005):无法更新。数据库或对象是只读的。

只要删除此属性。您可以通过代码做到这一点(假设strFilePath是Excel的路径)

System.IO.File.SetAttributes(strFilePath, System.IO.FileAttributes.Normal)