Ayuda con el Método String.Split

07/07/2004 - 00:38 por Eusebio | Informe spam
Hola todos,

Estoy tratando de convertir el contenido de un archivo *.sql en en un array
de string, dividiendo por la palabra clave GO. Para luego ejecutar los
comandos en la base de datos a través de un objeto oledb.OleDbCommand

El problema es que el comando (como yo lo hago) no me divide por el GO sino
solo por la G, y según veo en la ayuda este método permite deividir por
varios caracteres.

Lo que pienso es que estoy haciendo algo mal

este es un formulario de prueba que he hecho...les agradezco cualquier
sugerencia, en el ejemplo se vé cómo el comando deja la letro O, lo cual ,e
provoca un error al correr el comando.

Public Class frmSplitTest

Inherits System.Windows.Forms.Form

#Region " Código generado por el Diseñador de Windows Forms "

Public Sub New()

MyBase.New()

'El Diseñador de Windows Forms requiere esta llamada.

InitializeComponent()

'Agregar cualquier inicialización después de la llamada a
InitializeComponent()

End Sub

'Form reemplaza a Dispose para limpiar la lista de componentes.

Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)

If disposing Then

If Not (components Is Nothing) Then

components.Dispose()

End If

End If

MyBase.Dispose(disposing)

End Sub

'Requerido por el Diseñador de Windows Forms

Private components As System.ComponentModel.IContainer

'NOTA: el Diseñador de Windows Forms requiere el siguiente procedimiento

'Puede modificarse utilizando el Diseñador de Windows Forms.

'No lo modifique con el editor de código.

Friend WithEvents TextBox1 As System.Windows.Forms.TextBox

Friend WithEvents DataGrid1 As System.Windows.Forms.DataGrid

Friend WithEvents Button1 As System.Windows.Forms.Button

<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()

Me.TextBox1 = New System.Windows.Forms.TextBox()

Me.DataGrid1 = New System.Windows.Forms.DataGrid()

Me.Button1 = New System.Windows.Forms.Button()

CType(Me.DataGrid1, System.ComponentModel.ISupportInitialize).BeginInit()

Me.SuspendLayout()

'

'TextBox1

'

Me.TextBox1.Location = New System.Drawing.Point(25, 19)

Me.TextBox1.Multiline = True

Me.TextBox1.Name = "TextBox1"

Me.TextBox1.Size = New System.Drawing.Size(189, 225)

Me.TextBox1.TabIndex = 0

Me.TextBox1.Text = ""

'

'DataGrid1

'

Me.DataGrid1.DataMember = ""

Me.DataGrid1.HeaderForeColor = System.Drawing.SystemColors.ControlText

Me.DataGrid1.Location = New System.Drawing.Point(230, 19)

Me.DataGrid1.Name = "DataGrid1"

Me.DataGrid1.Size = New System.Drawing.Size(265, 160)

Me.DataGrid1.TabIndex = 1

'

'Button1

'

Me.Button1.Font = New System.Drawing.Font("Microsoft Sans Serif", 12.0!,
System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0,
Byte))

Me.Button1.Location = New System.Drawing.Point(230, 204)

Me.Button1.Name = "Button1"

Me.Button1.Size = New System.Drawing.Size(265, 40)

Me.Button1.TabIndex = 2

Me.Button1.Text = "Split "

'

'frmSplitTest

'

Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)

Me.ClientSize = New System.Drawing.Size(515, 273)

Me.Controls.AddRange(New System.Windows.Forms.Control() {Me.Button1,
Me.DataGrid1, Me.TextBox1})

Me.Name = "frmSplitTest"

Me.Text = "frmSplitTest"

CType(Me.DataGrid1, System.ComponentModel.ISupportInitialize).EndInit()

Me.ResumeLayout(False)

End Sub

#End Region

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click

Dim dt As New DataTable()

dt.Columns.Add("Comando", Type.GetType("System.String"))

Dim myRow As DataRow



Dim strArray() As String

strArray = Me.TextBox1.Text.Split("GO") 'Este comando divide la cadena pero
cada que encuentra una G

Dim i As Integer

If strArray.Length > 0 Then

For i = 0 To strArray.Length - 1

myRow = dt.NewRow

myRow("Comando") = strArray(i)

dt.Rows.Add(myRow)

Next

End If

Me.DataGrid1.DataSource = dt

End Sub

Private Sub frmSplitTest_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load

Me.TextBox1.Text = "Select * from A GO drop table B GO delete from C "

End Sub

End Class
 

Leer las respuestas

#1 Eduardo A. Morcillo [MS MVP VB]
07/07/2004 - 09:12 | Informe spam
Lo que pienso es que estoy haciendo algo mal



Ninguna de las sobrecargas de Split toma como parametro un string y los
cortes son por caracter y no por grupo de caracteres, es decir, si tienes
"a:b,c" y haces

Dim s1 As String = "a:b,c"
Dim s2() As String
s2 = s1.Split(":,".ToCharArray())

Obtendras 3 strings conteniendo "a","b" y "c".

Para separar una cadena en base a otra deberas usar la clase RegEx de
System.Text.RegularExpressions. El siguiente ejemplo te separa la cadena
donde se encuentre un GO que este entre dos caracteres de espaciado
(espacio, tab, nueva linea, etc):

Dim s2() As String
s2 = Regex.Split(sql, "\sGO\s")

Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo

Preguntas similares