19. november 2012 - 10:03Der 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;
Det er svært, når du ikke vil vise den kode der kalder Input0_ProcessInputRow(..)
Synes godt om
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
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 }
Synes godt om
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?
Synes godt om
Slettet bruger
19. november 2012 - 11:00#8
Jeg får forresten også en input string was not in correct format...
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.
Synes godt om
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
Synes godt om
Ny brugerNybegynder
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.