Domanda

Sto provando a generare il mio treeview in fase di esecuzione da una DataTable restituita da una query LINQ. I campi restituiti sono:

NAME = CaseNoteID | ContactDate | ParentNote TIPO = Guid | DateTime | Guid

Il campo ParentNote corrisponde a una voce nella colonna CaseNoteID. Seleziona (filtro) mi dà un errore di runtime di Impossibile trovare la colonna [ea8428e4]. che alfanumerico è la prima sezione di una delle Guide. Quando passo attraverso il mio filtro di codice = " ParentNote = ea8428e4-1274-42e8-a31c-f57dc2f189a4 "

Cosa mi sto perdendo?

var tmpCNoteID = dr["CaseNoteID"].ToString();
                var filter = "ParentNote="+tmpCNoteID;

                DataRow[] childRows = cNoteDT.Select(filter);
È stato utile?

Soluzione

Prova a racchiudere il GUID tra virgolette singole:

var filter = "ParentNote='"+tmpCNoteID+"'";

Altri suggerimenti

questo dovrebbe funzionare:

   var tmpCNoteID = dr["CaseNoteID"].ToString();
                var filter = "ParentNote=\""+tmpCNoteID+"\"";

                DataRow[] childRows = cNoteDT.Select(filter);

So che questo è un vecchio thread, ma volevo aggiungere un addendum ad esso. Quando si utilizza l'operatore IN con un Guid (es: ParentNote IN (,, ecc.)), Le virgolette singole non vengono più accettate. In tal caso, è necessario il metodo CONVERT (suggerito da granadaCoder). (Le virgolette singole sollevano un'eccezione nel confrontare un Guid con una stringa con l'operatore '=' ... che in realtà non stiamo usando.)

Dettagli: ho ereditato un codice legacy che ha creato una stringa di filtro di grandi dimensioni nel formato: MyColumn = '11111111-2222-3333-4444-555555555555' OR MyColumn = '11111111-2222 -3333-4444-55555555555555 '....

Quando il numero di guide (e, quindi, il numero di clausole OR) è diventato troppo grande, ciò ha causato un'eccezione di overflow dello stack. Sostituendo le numerose clausole OR con una clausola IN, sono stato in grado di impostare il filtro senza eccezioni. Ma usare una clausola IN significa dover usare l'approccio CONVERT.

Ecco un metodo che uso:

            MyStrongDataSet ds = new MyStrongDataSet();
            Guid myUuid = new Guid("11111111-2222-3333-4444-555555555555");

            System.Data.DataRow[] rows = ds.MyStrongTable.Select("MyGuidProperty = (CONVERT('" + myUuid.ToString("N") + "', 'System.Guid'))");


            //Fish out a single row if need be and cast to a strong row
            if (null != rows)
            {
                if (rows.Length > 0)
                {
                    MyStrongDataSet.MyStrongTableRow returnRow = rows[0] as MyStrongDataSet.MyStrongTableRow;
                    return returnRow;

                }
            }
            return null;

Ecco una leggera variazione:

  string filterSql = "MyGuidProperty ='{0}'";

  filterSql = string.Format(filterSql, Guid.NewGuid().ToString("D"));
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top