Getting a Return Value from a Stored Procedure


Author
Message
Charles R Hankey
Charles R Hankey
Advanced StrataFrame User (764 reputation)Advanced StrataFrame User (764 reputation)Advanced StrataFrame User (764 reputation)Advanced StrataFrame User (764 reputation)Advanced StrataFrame User (764 reputation)Advanced StrataFrame User (764 reputation)Advanced StrataFrame User (764 reputation)Advanced StrataFrame User (764 reputation)Advanced StrataFrame User (764 reputation)
Group: Forum Members
Posts: 524, Visits: 30K
Hey Edhy -

It's Monday and I have SET STUPID ON but could you clarify the select statement?  It looks like you are looking for records with duplicate primary keys?

I have a function like this checking dupes but I pass in the where that determines what a "match" is.

This looks like you are checking for duplicate primary keys?  Isn't that prevented on the backend to start with ?

(or do I completely misunderstand what is going on ?)

Could you show an example of what the string.format would resolve to?
Edhy Rijo
E
StrataFrame VIP (3.7K reputation)StrataFrame VIP (3.7K reputation)StrataFrame VIP (3.7K reputation)StrataFrame VIP (3.7K reputation)StrataFrame VIP (3.7K reputation)StrataFrame VIP (3.7K reputation)StrataFrame VIP (3.7K reputation)StrataFrame VIP (3.7K reputation)StrataFrame VIP (3.7K reputation)
Group: StrataFrame Users
Posts: 2.4K, Visits: 23K
Hi Charles,

SET STUPID OFF (on my side Tongue)

Yes you are right, this one is looking for duplicates in the primary key field, but the function can be enhanced by passing the field name to be used in the SELECT statement, here is an untested sample code, please let us know if this may work for you?

    ''' <summary>
    ''' This a generic function to find duplicate records in tables where the Primary Key is an integer
    ''' </summary>
    ''' <param name="FieldName">The field name used in the SQL to check for duplicate.</param>
    ''' <returns>True if duplicate records are found.</returns>
    ''' <remarks>This code should only work any field type.</remarks>
    Public Function DuplicateRecordFound(ByVal FieldName As StringAs Boolean
        If Not Me.CheckColumnExists(Me.CurrentDataTable, FieldName, GetType(String)) Then
            Exit Function
        End If

        '-- Create the SqlCommand with an Using to automatically dispose it.
        Using cmd As New SqlCommand
            cmd.CommandType = CommandType.Text
            cmd.CommandText = String.Format("SELECT COUNT({0}) FROM {1} WHERE {0} > 0 GROUP BY {0} HAVING COUNT(1) > 0", FieldName, Me.TableNameAndSchema)

            '-- Execute the query and return the value
            Return CType(Me.ExecuteScalar(cmd), Integer) > 0
        End Using
    End Function


    ''' <summary>
    ''' Ensures that the column specified exists within the table.
    ''' </summary>
    ''' <param name="table"></param>
    ''' <param name="columnName"></param>
    ''' <param name="columnType"></param>
    ''' <remarks></remarks>
    Public Function CheckColumnExists(ByVal table As DataTableByVal columnName As StringByVal columnType As System.TypeAs Boolean
        '-- Establish Locals
        Dim col As DataColumn
        Dim columnFound As Boolean = False

        '-- Cycle through all of the columns so we can test on a case-insensitive basis
        For Each col In table.Columns
            '-- Check to see if the column name matches
            columnFound = col.ColumnName.Equals(columnName, StringComparison.OrdinalIgnoreCase)

            '-- If the column was found, exit
            If columnFound Then Exit For
        Next

        '-- If the column is not found then throw and error letting the developer knows that the field name passed is wrong.
        CheckColumnExists = columnFound
        If Not columnFound Then
            Dim errMsg As String = String.Format("Make sure the field name [{0}] exist in this table {1}.", columnName, Me.TableNameAndSchema)
            Throw New Exception(errMsg)
        End If
    End Function


Edhy Rijo

Edited 14 Years Ago by Edhy Rijo
Charles R Hankey
Charles R Hankey
Advanced StrataFrame User (764 reputation)Advanced StrataFrame User (764 reputation)Advanced StrataFrame User (764 reputation)Advanced StrataFrame User (764 reputation)Advanced StrataFrame User (764 reputation)Advanced StrataFrame User (764 reputation)Advanced StrataFrame User (764 reputation)Advanced StrataFrame User (764 reputation)Advanced StrataFrame User (764 reputation)
Group: Forum Members
Posts: 524, Visits: 30K
  >> cmd.CommandText = String.Format("SELECT COUNT({0}) FROM {1} WHERE {0} > 0 GROUP BY {0} HAVING COUNT(1) > 0"Me.PrimaryKeyField, Me.TableNameAndSchema)

I'd suggest :
cmd.CommandText = String.Format("SELECT COUNT({0}), {2}  FROM {1} GROUP BY {2} HAVING COUNT({0}) > 1"Me.PrimaryKeyField, Me.TableNameAndSchema, Fieldname)

where fieldnames is a single field or comma separated string of fields that defines a dupe


I was thrown by looking for dupes based on PK as the whole idea of a PK is that they be unique to begin with.



Edhy Rijo
E
StrataFrame VIP (3.7K reputation)StrataFrame VIP (3.7K reputation)StrataFrame VIP (3.7K reputation)StrataFrame VIP (3.7K reputation)StrataFrame VIP (3.7K reputation)StrataFrame VIP (3.7K reputation)StrataFrame VIP (3.7K reputation)StrataFrame VIP (3.7K reputation)StrataFrame VIP (3.7K reputation)
Group: StrataFrame Users
Posts: 2.4K, Visits: 23K
Hi Charles,

I had to do the test this time, since it is not productive posting without testing, but sometimes, there is not much time to get everything right the first time BigGrin  so here is a generic statement that will check for duplicate for a single field, of course this could be enhanced to go deeper with multiple fields and "WHERE" conditions per needs like in Terry's case in which he needs a WHERE condition.

    Public Function DuplicateRecordFound(ByVal FieldName As StringAs Boolean
        If Not Me.CheckColumnExists(Me.CurrentDataTable, FieldName, GetType(String)) Then
            Exit Function
        End If

        '-- Create the SqlCommand with an Using to automatically dispose it.
        Using cmd As New SqlCommand
            cmd.CommandType = CommandType.Text
            cmd.CommandText = String.Format("SELECT COUNT(*) FROM {1} GROUP BY {0} HAVING COUNT(*) > 0", FieldName, Me.TableNameAndSchema)

            '-- Execute the query and return the value
            Return CType(Me.ExecuteScalar(cmd), Integer) > 1
        End Using
    End Function


Here is a sample on how to call the function in the BO.  Of course if you have this function in your base BO it will be available to all of them and just need to pass the field name to check for duplicate:

        If Me.BizCompany1.DuplicateRecordFound(bizCompany.bizCompanyFieldNames.CompanyName.ToString) Then
            MessageBox.Show("Duplicate found.""Duplicate check"MessageBoxButtons.OK, MessageBoxIcon.Error)
        Else
            MessageBox.Show("No duplicates found.""Duplicate check"MessageBoxButtons.OK, MessageBoxIcon.Information)
        End If

        Using bo As New bizCompany
            If bo.DuplicateRecordFound(bizCompany.bizCompanyFieldNames.CompanyName.ToString) Then
                MessageBox.Show("Duplicate found.""Duplicate check"MessageBoxButtons.OK, MessageBoxIcon.Error)
            Else
                MessageBox.Show("No duplicates found.""Duplicate check"MessageBoxButtons.OK, MessageBoxIcon.Information)
            End If
        End Using


Terry, notice that in above sample code I am not passing the field name as literal string "Field Name" or "CompanyName", instead I am taking advantage of the business object field name enumeration which will be named after your bo+FieldNames, this is used, so if you change a field name later on, at least Visual Studio will warn you at compilation giving you the chance to correct the field name before building your application.

Charles, thanks again, for looking into the code and your suggestions, greatly appreciated as always.  Now back to work, hope this test pass Hehe




Edhy Rijo

Charles R Hankey
Charles R Hankey
Advanced StrataFrame User (764 reputation)Advanced StrataFrame User (764 reputation)Advanced StrataFrame User (764 reputation)Advanced StrataFrame User (764 reputation)Advanced StrataFrame User (764 reputation)Advanced StrataFrame User (764 reputation)Advanced StrataFrame User (764 reputation)Advanced StrataFrame User (764 reputation)Advanced StrataFrame User (764 reputation)
Group: Forum Members
Posts: 524, Visits: 30K
This looks good.  Also, if you pass a comma separated list of fields to the fieldname param it will work fine for defining a dupe based on multiple fields

Dim fieldlist as string = "field1, field2, field3"

then pass fieldlist as the param.
Edhy Rijo
E
StrataFrame VIP (3.7K reputation)StrataFrame VIP (3.7K reputation)StrataFrame VIP (3.7K reputation)StrataFrame VIP (3.7K reputation)StrataFrame VIP (3.7K reputation)StrataFrame VIP (3.7K reputation)StrataFrame VIP (3.7K reputation)StrataFrame VIP (3.7K reputation)StrataFrame VIP (3.7K reputation)
Group: StrataFrame Users
Posts: 2.4K, Visits: 23K
Charles R Hankey (11/29/2010)
This looks good.  Also, if you pass a comma separated list of fields to the fieldname param it will work fine for defining a dupe based on multiple fields


Charles, I agree, but I would prefer a param array and then check if Column Exist for each one before executing the query.  Also a 2nd optional parameter could be use to handle "WHERE conditions like in Terry's case.

So far, I did not have the need for such checking, but since I work on multiple projects at the same time, I like to have my code as generic as possible so it can be reused in all projects, even though I do not have a common assembly for all projects just yet Angry

I am still learning this stuff which always amaze me with simple things and the .Net/SF approach to handle them.  Pure and simple, I just love SF at the same level I loved VFP and my previous framework.  It feels good being comfortable with a tool and I am at that level with StrataFrame now.  (hmmm, Trent, that does not mean I am totally settle,  I still want to see the new StrataListView completed with the automation stuff Rolleyes)

Edhy Rijo

Terry Bottorff
Terry Bottorff
Advanced StrataFrame User (656 reputation)Advanced StrataFrame User (656 reputation)Advanced StrataFrame User (656 reputation)Advanced StrataFrame User (656 reputation)Advanced StrataFrame User (656 reputation)Advanced StrataFrame User (656 reputation)Advanced StrataFrame User (656 reputation)Advanced StrataFrame User (656 reputation)Advanced StrataFrame User (656 reputation)
Group: Forum Members
Posts: 448, Visits: 12K
I did find the Primary Key problem and I was able to change that but now with All of the Great Ideas I will be looking to change almost all of my fill routines. 
Charles R Hankey
Charles R Hankey
Advanced StrataFrame User (764 reputation)Advanced StrataFrame User (764 reputation)Advanced StrataFrame User (764 reputation)Advanced StrataFrame User (764 reputation)Advanced StrataFrame User (764 reputation)Advanced StrataFrame User (764 reputation)Advanced StrataFrame User (764 reputation)Advanced StrataFrame User (764 reputation)Advanced StrataFrame User (764 reputation)
Group: Forum Members
Posts: 524, Visits: 30K
I think your idea of an array for multiple fields is very good, especially in keeping the function as generic as possible.

Just as an aside :  I've been working a lot with using table value parameters in stored procedures and I'm really interested to find that unlike other type of params, you don't need to account for *not* passing the param - the TVP in the sproc will just be an empty table.  Interesting in that you can write where clauses in the sproc that let you receive either a single or TVP param for comparison and it will work depending on what you pass in. 

( reading that over it probably doesn't make any sense unless you've been playing with TVPs but for anybody who has, the TVP as empty table if no param is passed came as a surprise to me and somebody may find it useful )
Tags
Edhy Rijo
E
StrataFrame VIP (3.7K reputation)StrataFrame VIP (3.7K reputation)StrataFrame VIP (3.7K reputation)StrataFrame VIP (3.7K reputation)StrataFrame VIP (3.7K reputation)StrataFrame VIP (3.7K reputation)StrataFrame VIP (3.7K reputation)StrataFrame VIP (3.7K reputation)StrataFrame VIP (3.7K reputation)
Group: StrataFrame Users
Posts: 2.4K, Visits: 23K
Terry Bottorff (11/29/2010)
...but now with All of the Great Ideas I will be looking to change almost all of my fill routines. 


Hi Terry,

I've been there, done that! Welcome to the club Hehe

Glad you find it useful.

Edhy Rijo

Edhy Rijo
E
StrataFrame VIP (3.7K reputation)StrataFrame VIP (3.7K reputation)StrataFrame VIP (3.7K reputation)StrataFrame VIP (3.7K reputation)StrataFrame VIP (3.7K reputation)StrataFrame VIP (3.7K reputation)StrataFrame VIP (3.7K reputation)StrataFrame VIP (3.7K reputation)StrataFrame VIP (3.7K reputation)
Group: StrataFrame Users
Posts: 2.4K, Visits: 23K
Charles R Hankey (11/29/2010)
(... reading that over it probably doesn't make any sense unless you've been playing with TVPs but for anybody who has, the TVP as empty table if no param is passed came as a surprise to me and somebody may find it useful )

Hi Charles,

I have not worked with a TVP yet.  I have a consultant "Uri Dimant" which is a MS SQL MVP which helps me with those deep needs and even though he is pretty good explaining this type of things with MS-SQL, sometimes I don't have the luxury to pay to much of attention to details.  He has created some complex stored procedures to deal with millions of records and re-factored those couple of times to take advantage of new functionality of MS-SQL 2008 R2.  In case you or anyone needs serious help with any MS-SQL problem, feel free to contact him.


Edhy Rijo

GO

Merge Selected

Merge into selected topic...



Merge into merge target...



Merge into a specific topic ID...




Similar Topics

Reading This Topic

Login

Explore
Messages
Mentions
Search