Avatar billede Slettet bruger
19. november 2012 - 10:03 Der er 9 kommentarer og
1 løsning

object reference not set to be an instance of an object

Hej! Håber i kan hjælpe med denne - Og beklager jeg fik slettet mine tidligere indlæg, men havde noget i som ikke skulle ses af andre - det er jeg selvf obs på nu :)

Jeg får følgende fejl:
object reference not set to be an instance of an object

  at ScriptMain.Input0_ProcessInputRow(Input0Buffer Row)
  at UserComponent.Input0_ProcessInput(Input0Buffer Buffer)
  at Microsoft.SqlServer.Dts.Pipeline.ScriptComponentHost.ProcessInput(Int32 inputID, PipelineBuffer buffer)


using System.Text;
using System.Data.SqlClient;
using System;
using System.Data;
using System.Linq;
using System.IO;
using System.Windows.Forms;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;

[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]

public class ScriptMain : UserComponent

{
    //Declare variables
    private string PriceNvarchar;
    private int XXXID;
    SqlCommand sqlCmd;
  SqlParameter sqlParam;
  SqlConnection sqlCnn;
    string sql = null; 
   
public override void PreExecute()
    {
        base.PreExecute();
        string connetionString = null;
        SqlConnection sqlCnn;
        connetionString = "Data Source=XXX;Initial Catalog=RaptorData;User ID=XXX;Password=XXX";
        sqlCnn = new SqlConnection(connetionString);
        sqlCnn.Open();
        sqlCmd = new SqlCommand("UPDATE XXX.Dbo.XXX SET Price = @Price where EntryID = @EntryID", sqlCnn);
        sqlParam = new SqlParameter("@Price", SqlDbType.Float);
        sqlCmd.Parameters.Add(sqlParam);
        sqlParam = new SqlParameter("@EntryID", SqlDbType.Int);
        sqlCmd.Parameters.Add(sqlParam);

     
    }

   
    public override void Input0_ProcessInputRow(Input0Buffer Row)
    {
        {
            sqlCmd.Parameters["@Price"].Value = Row.Price;
            sqlCmd.Parameters["@EntryID"].Value = Row.EntryID;


            sqlCmd.ExecuteNonQuery();
                      sqlCnn.Close();

         
        }
     
    }
 

}
Avatar billede bvli Praktikant
19. november 2012 - 10:09 #1
Din Row instans er null når du leverer den over til (din i øvrigt mundrette navngivne) Input0_ProcessInputRow(...)
Avatar billede Slettet bruger
19. november 2012 - 10:11 #2
tak! og det må du gerne lige uddybe lidt - Er noob til c# - Hvordan vil du løse dette?
Avatar billede bvli Praktikant
19. november 2012 - 10:32 #3
Det er svært, når du ikke vil vise den kode der kalder  Input0_ProcessInputRow(..)
Avatar billede Slettet bruger
19. november 2012 - 10:36 #4
Den ser sådan her ud :D

public override void Input0_ProcessInputRow(Input0Buffer Row)
    {

        //var s = Row.PriceNvarchar;
        //var result = Regex.Replace(s, @"(\.|\,)", m => m.NextMatch().Success ? "" : ".");

        var sb = new StringBuilder(Row.PriceNvarchar).Replace(".", "").Replace(',', '.'); //Fjerne de forkerte "." fra stringe. Derefter erstat alle "," med "."
        var count = sb.ToString().Where(x => x == '.').Count();
        if (count > 1) // more than 1 dot in the string. Replace the first one.
          sb.Replace(".", "", sb.ToString().IndexOf('.'), 1); //Er der flere end to "." så fjern det første
 
        Row.Price = float.Parse(sb.ToString());
        //Smid resultatet tilbage i input
Avatar billede Slettet bruger
19. november 2012 - 10:37 #5
den i midten bruger jeg!
Avatar billede bvli Praktikant
19. november 2012 - 10:50 #6
Nåeh.. Det er jo ikke den kode der kalder den. Altså i den kode du viser ovenfor, der bruger du metoder og properties på "Row". Hvis "Row" er null, og du f.eks. prøver at få fat i Row.PriceNvarchar, så vil du få den fejl som du ser, da du ikke kan kalde PriceNvarchar på et object som er null.

Som det første skal du sikre dig, at du ikke kalder metoden med et null object. Det betyder, at du i den kode der /kalder/ metoden, skal lave en konstruktion a'la:

var row = //den måde du får din row på

if (row != null) {
  Input0_ProcessInputRow(row)
} else {
  //Skriv en fejlbesked om, at den row du har fået er null - eller ignorer det eller hva' du vil.
}

Da din Input0_ProcessInputRow(Input0Buffer Row) er public, er det i øvrigt god stil, at du lige checker på argumenterne du får ind. Altså enten:

public void Input0_ProcessInputRow(Input0Buffer row){
  if (row == null) {
    return;
  }
  //fortsæt som før
}

Eller:

public void Input0_ProcessInputRow(Input0Buffer row){
  if (row == null) {
    throw new ArgumentNullException("row");
  }
  //fortsæt som før
}
Avatar billede Slettet bruger
19. november 2012 - 10:53 #7
Jeg fixede det ved at komme sqlCnn.Close();

Ned i en PostExecute...

Men nu får jeg en timeout og og en object reference not set i min postexecute..

har det noget med min sqlConn.close at gøre?
Avatar billede Slettet bruger
19. november 2012 - 11:00 #8
Jeg får forresten også en input string was not in correct format...
Avatar billede bvli Praktikant
19. november 2012 - 11:03 #9
Som sagt. Du kalder en metode eller tilgår en property på en objektreference som er null. NullReferenceExceptions er det letteste at debugge, da du får linienummeret præcis hvor det foregår.
Avatar billede Slettet bruger
19. november 2012 - 11:19 #10
Jep! Jeg har 2 kolonner

PriceNvarchar som er mine priser.

Denne PriceNvarchar laver jeg om så der kun er 1 punktum i. vha.
public override void Input0_ProcessInputRow(Input0Buffer Row)
    {

var s = Row.PriceNvarchar;
var result = Regex.Replace(s, @"(\.|\,)", m => m.NextMatch().Success ? "" : ".");

Row.Price = float.Parse(result);

Dernæst laver jeg en ny script component der skal indsætte min Priser frr PriceNvarchar ind i min kolonne price (hele kolonnen er null)

Men denne updatere jeg jo med mit SQL statement.

Hvordan vil du løse det??? altås hvor skal jeg skrive det? Jeg er rimelig rookie så du skal nok fortælle mig det helt præcist :) hehe
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester