2017-08-14 4 views
0

Ich habe SQL-Strings wie die folgenden, mit mehreren Trues und Falses:kann nicht bools mit ints ersetzen

INSERT INTO SystemRules (Col1, Col2, Col3, Col4, Col5) 
Values (False,False,True,False,False) 

Ich möchte alle mit 0 Falsch ersetzen und alle Wahr mit 1. Aber wenn ich versuche, diese :

sql = sql.Replace(",True,", ",1,").Replace(",True)", ",1)").Replace(",False,", ",0,").Replace(",False)", ",0)"); 

... es entfernt nur einige der Falschen ... nicht alle von ihnen. Zum Beispiel habe ich am Ende mit auf den Punkt:

INSERT INTO SystemRules (Col1, Col2, Col3, Col4, Col5) 
Values (0,0,1,0,0) 

Also dann versuche ich regex statt (nur 1 Stück unten angezeigt):

INSERT INTO SystemRules (Col1, Col2, Col3, Col4, Col5) 
Values (0,False,1,0,False) 

Was ich dies erwartet war

sql = Regex.Replace(sql, ",True)", ",1)"); 

Diese bestimmte Linie explodiert mit diesem Fehler: parsing ",True)" - Too many)'s.

Was ist der effizienteste Weg, um alle zu ersetzen Wahr und False in einer SQL-Anweisung mit 1s und 0s? Ich habe immer string.Replace() in C# global ersetzt, ich bin verwirrt, warum es einige fehlt. Da sind keine Räume drin, ich habe dreifach überprüft. Ein Beweis dafür ist, dass, wenn ich die Reihe von REPLACEs über ein zweites Mal laufen lasse, es ersetzt die Nachzügler. Warum nicht das erste Mal? Ist C# replace wirklich nicht global? Vielen Dank.

+1

auf eine sehr einfache Art und Weise getan werden, warum es nicht während des SQL Gebäude 'col1Value 1: 0 'oder' col1Value == "True"? 1: 0' – ASpirin

+3

Ich weiß nicht, wie es das erste 'False' durch' 0' even ersetzt hat, da keines Ihrer '.Replace()' Argumente 'False' ohne vorangestelltes erlaubt Komma. – itsme86

+2

Der Versuch, das Problem zu reproduzieren, führt nicht zu dem von Ihnen beschriebenen Ergebnis. Ihre Beschreibung des Problems ist nicht korrekt: http://ideone.com/FzUE6c – JLRishe

Antwort

3

Sie erhalten den Fehler mit Regex.Replace, weil ) ein Metazeichen ist, das maskiert werden muss. eine Backspace (zwei Backspaces für reguläre C# string) vergeben hat dieses Problem lösen:

sql = Regex.Replace(sql, ",True\\)", ",1\\)"); 

Sie können mit \\b Ankerzieh Komma/Klammern vereinfachen:

sql = Regex.Replace(sql, "\\bTrue\\b", "1"); 

jedoch SQL Manipulation als eine Zeichenfolge a sehr gefährliche Idee (why?). Sie sollten Ihren Code stattdessen so umstellen, dass stattdessen parametrisiertes SQL verwendet wird (how?).

+0

Danke! Mach dir keine Sorgen über SQL-Injektion, das ist eine Backoffice-App, die keine Benutzereingaben enthält. – HerrimanCoder

0

Es besteht keine Notwendigkeit zu setzen Regex oder „True“ Es kann

string s="INSERT INTO SystemRules (Col1, Col2, Col3, Col4, Col5)Values (False,False,True,False,False)"; 
     s=s.Replace("False", "0").Replace("True", "1"); 
Verwandte Themen