Wednesday, September 23, 2020

Capturing the file name and line number of an Exception

Handling exceptions is a critical task in any application.  When an exception is logged, it needs to have sufficient detail so it can be researched at a later time.  In addition, as a developer, you want to extract and log as much detail about it as possible.  Some of those details include the file name and line number where the exception occurred.  Listed below is a method that handles exceptions, extracts the message, file name, and line number for logging.

 

 

        private void ProcessEx(Exception ex, string details = "")

        {

            int lineNumber = 0;

            const string lineNumberMarker = ":line ";

            string traceText = ex.StackTrace + "";  //Adding empty space will ensure final value is never null

 

            int lineIndex = traceText.LastIndexOf(lineNumberMarker);

            if (lineIndex >= 0)

            {

                string lineNumberText = traceText.Substring(lineIndex + lineNumberMarker.Length);

                int.TryParse(lineNumberText, out lineNumber);

            }

 

            string fileName = string.Empty;

            const string fileNameMarker = " in ";

            int fileNameIndex = traceText.LastIndexOf(fileNameMarker);

            if (fileNameIndex >= 0)

            {

                int fileNameStart = fileNameIndex + fileNameMarker.Length;

                int fileNameLength = lineIndex - fileNameIndex - fileNameMarker.Length;

                fileName = traceText.Substring(fileNameStart, fileNameLength);

            }

 

            //Log error message + file/line info

            string msg = $"Error: {ex.Message}. \r\n{details}";

            string fileInfo = $"\r\nFile {fileName}, Line {lineNumber} ";

            Logging lg = new Logging();

            lg.WriteLog(msg + fileInfo);           

        }

 

Friday, September 18, 2020

Changing DB Password in Oracle SQL Developer

While working with Oracle SQL Developer, you may encounter the following message when the password is near expiration.

 

5

 

A database warning was encountered performing the requested operation:

 

ORA-28002: the password will expire within 5 days

28002. 00000 -  "the password will expire within %s days"

*Cause:    The user's account is about to expire and the password

           needs to be changed

*Action:   change the password or contact the DBA

Vendor code 28002

 

 

To change the password:

  1. Open the Connections tab (View > Connections)
  2. Right click the database where the password needs to be changed
  3. Select “Reset Password…”

 

 

  1. A pop-up form (see below) will appear prompting for the old and new passwords.

 

 

That’s it.  Seems simple but if you’re not familiar with SQL Developer, this can be a frustrating.

Wednesday, September 2, 2020

Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

Overview: I have a Windows Form application, built in .Net 4.7.2 using Visual Studio 2019.  The form has 3 PartID combo boxes, allowing the user to select 3 distinct part IDs from a finite list of parts in the drop down.

 

 

Problem: When the combo box was being filled with values in the drop down list, the following exception was thrown.

 

Exception:

System.AccessViolationException

  HResult=0x80004003

  Message=Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

  Source=<Cannot evaluate the exception source>

  StackTrace:

<Cannot evaluate the exception stack trace>

 

Code:

        private void cbPO_LostFocus(object sender, EventArgs e)

        {

            FillPartID1(poLines);

        }

 

 

        private void cbPO_SelectedIndexChanged(object sender, EventArgs e)

        {

            FillPartID1(poLines);

        }

 

        private void FillPartID1(DataTable poLines)

        {

            AutoCompleteStringCollection acs1 = new AutoCompleteStringCollection();

 

            foreach (var rec in poLines.AsEnumerable())

               acs1.Add(rec.ItemArray[1].ToString());           

 

            cbPartID1.AutoCompleteCustomSource = acs1;

            cbPartID1.AutoCompleteMode = AutoCompleteMode.SuggestAppend;    //Exception thrown here during 2nd execution

            cbPartID1.AutoCompleteSource = AutoCompleteSource.CustomSource;

 

            cbPartID1.DataSource = poLines;

            cbPartID1.DisplayMember = "PART_ID";

            cbPartID1.ValueMember = "PART_ID";

            cbPartID1.SelectedIndex = -1;

        }

 

Cause: The FillPartID1() was being called twice due to event handlers cbPO_SelectedIndexChanged() and cbPO_LostFocus().

 

Solution: Refactor the code so FillPartID1() is called only once.

ComboBox selection changes selection in other comboBox controls

Overview: I have a Windows Form application, built in .Net 4.7.2 using Visual Studio 2019.  The form has 3 PartID combo boxes, allowing the user to select 3 distinct part IDs from a finite list of parts in the drop down.

 

 

Problem: Once the user selects a PartID in any combo box, the other 2 combo boxes are automatically set to that value.

 

 

        private void Start()

        {

            DataTable POLines = GetLineNumsByPO(PO);

 

            FillPartID1(POLines);

            FillPartID2(POLines);

            FillPartID3(POLines);           

        }

 

 

        private void FillPartID1(DataTable poLines)

        {

            AutoCompleteStringCollection acs1 = new AutoCompleteStringCollection();

 

            foreach (var rec in poLines.AsEnumerable())

               acs1.Add(rec.ItemArray[1].ToString());           

 

            cbPartID1.AutoCompleteCustomSource = acs1;

            cbPartID1.AutoCompleteMode = AutoCompleteMode.SuggestAppend;

            cbPartID1.AutoCompleteSource = AutoCompleteSource.CustomSource;

 

            cbPartID1.DataSource = poLines;

            cbPartID1.DisplayMember = "PART_ID";

            cbPartID1.ValueMember = "PART_ID";

            cbPartID1.SelectedIndex = -1;

        }

 

 

        private void FillPartID2(DataTable poLines)

        {

            AutoCompleteStringCollection acs2 = new AutoCompleteStringCollection();

 

            foreach (var rec in poLines.AsEnumerable())

                acs2.Add(rec.ItemArray[1].ToString());

 

            cbPartID2.AutoCompleteCustomSource = acs2;

            cbPartID2.AutoCompleteMode = AutoCompleteMode.SuggestAppend;

            cbPartID2.AutoCompleteSource = AutoCompleteSource.CustomSource;

 

            cbPartID2.DataSource = poLines;

            cbPartID2.DisplayMember = "PART_ID";

            cbPartID2.ValueMember = "PART_ID";

            cbPartID2.SelectedIndex = -1;

        }

 

 

        private void FillPartID3(DataTable poLines)

        {

            AutoCompleteStringCollection acs3 = new AutoCompleteStringCollection();

 

            foreach (var rec in poLines.AsEnumerable())

                acs3.Add(rec.ItemArray[1].ToString());

 

 

            cbPartID3.AutoCompleteCustomSource = acs3;

            cbPartID3.AutoCompleteMode = AutoCompleteMode.SuggestAppend;

            cbPartID3.AutoCompleteSource = AutoCompleteSource.CustomSource;

 

            cbPartID3.DataSource = poLines;

            cbPartID3.DisplayMember = "PART_ID";

            cbPartID3.ValueMember = "PART_ID";

            cbPartID3.SelectedIndex = -1;

        }

 

 

Solution: The Start() method was modified to have 3 separate datatables, each one passed to a partID comboBox.  This resolved one combo box selection updating the other combo boxes

 

        private void Start()

        {

            //3 separate datatables were required to avoid having one PartID selection update another PartID control.

            DataTable POLines1 = GetLineNumsByPO(PO);

            DataTable POLines2 = GetLineNumsByPO(PO);

            DataTable POLines3 = GetLineNumsByPO(PO);

 

            FillPartID1(POLines1);

            FillPartID2(POLines2);

            FillPartID3(POLines3);           

        }

 

Thursday, August 27, 2020

Sep' 20 .Net Events

Virtual User Group Meetings

Sep 1: ONSQL-Cleveland “SQL Azure Deployment Options”

https://ohionorth.pass.org/

 

Sep 10: .Net Virtual User Group “Adding a little DAPR to .NET Microservices”

https://www.meetup.com/dotnet-virtual-user-group/events/272490405/

 

Sep 16: Hudson Software Craftsmanship “Crafting Better Software”

https://www.meetup.com/Hudson-Software-Craftsmanship-Meetup/

 

Sep 24: Cleveland C#/VB.Net User Group

https://www.meetup.com/Cleveland-C-VB-Net-User-Group/

 

 

Virtual Conferences

Aug 28: .NET Dev Summit 2020 (Bengaluru): https://bdotnet.in/dotnet-dev-summit-2020/

 

Aug 29: SQL Saturday (Salt Lake City, UT): https://www.sqlsaturday.com/997/

 

Monday, August 10, 2020

.Net Virtual Events - Aug 2020

Like Technical Events?  Me too!  Here’s a list of .Net related events online and free of charge.

Aug 11: “Come meet the new .NET Standard MVVM” - https://www.meetup.com/dotnet-virtual-user-group/events/272490308

Aug 12-14: Pittsburgh Tech Fest - http://www.pghtechfest.com/

Aug 13: “Migrate Your Apps and SQL Server Databases to Azure” - https://info.microsoft.com/ww-landing-azure-webinar-series-migrate-your-apps-and-sql-server-databases-to-azure.html?lcid=en-us&ocid=mkto_eml_EM666897A1LA1&ocid=eml_pg189324_gdc_comm_az

Aug 13: “Breaking Bad Habits: Solutions for Common Query Antipatterns” - https://www.meetup.com/Louisville-Data-Technology-Group/events/270966985/

Aug 13-14: JavaScript & Friends Conference - https://www.javascriptandfriends.com/  

Aug 19: Hudson Software Craftsmanship - https://www.meetup.com/Hudson-Software-Craftsmanship-Meetup/

Aug 27: “Dialogue with your Data: Interactive AI with Cognitive Services” - https://www.meetup.com/Cleveland-C-VB-Net-User-Group/events/272490398/?isFirstPublish=true

Aug 29: SQL Saturday-Salt Lake City: https://www.sqlsaturday.com/997/eventhome.aspx

 

Sign up and skill up!

Friday, July 31, 2020

Global 2020 Summer AI/ML Fest

The Global 2020 Summer AI/ML Fest is a virtual event with 8 tracks (3 Developer, 3 Business, 2 ML).  The event took place on Friday, July 31, 2020.  If you missed this free event or want to revisit some of the sessions, the links below provide access to all content:

 

Full listing of all sessions: https://aka.ms/summer2020-globalaimlfest.com

 

Presentation Slides: https://aka.ms/downloads-global2020summeraimlfest

 

Recorded Sessions:  https://aka.ms/azurecloudevents  

 

Thursday, July 23, 2020

Monday, June 29, 2020

KeyCode vs. KeyData vs. KeyValue

When trying to examine user keystrokes in Windows Forms, the .Net Framework and .Net Core offer a variety of properties:

 

Keys: an enumeration in the System.Windows.Forms namespace that Specifies key codes and modifiers.

 

KeyCode: returns the System.Windows.Forms.Keys value that is the key code for the event.

 

KeyData: Returns the System.Windows.Forms.Keys representing the key code for the key that was pressed, combined with modifier flags that indicate which combination of CTRL, SHIFT, and ALT keys was pressed at the same time.

 

KeyValue: returns the integer representation of the KeyCode property.

 

 

Example:

tbUnitPrice.PreviewKeyDown += new PreviewKeyDownEventHandler(this.tbUnitPrice_PreviewKeyDown);  //Add event handler to capture keystroke

 

 

        private void tbUnitPrice_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)

        {

            var keycode = e.KeyCode;

            var keydata = e.KeyData;

            var keyValue = e.KeyValue;

 

            if ( (keycode == Keys.Tab) || (keycode == Keys.Enter) )

            {

                dgParts.CurrentCell = dgParts.Rows[dgParts.CurrentRow.Index + 1].Cells[0];                   //Move to the 1st cell of the next row

 

            }

        }

 

Wednesday, June 17, 2020

BlazorDay is June 18, 2020

BlazorDay is almost here. Starting Thursday, June 18, at 8:00 AM Pacific Time or 5:00 PM Paris Time.
Don't miss the keynote with Daniel Roth, the Blazor Program Manager at Microsoft. Daniel will be followed by 8 greats experts of the Blazor world.

1. What is the session planning?
The full planning is available on https://www.blazorday.net/planning.

2. How to see the live show?
Go to https://BlazorDay.net/live or directly to Youtube on https://youtu.be/XoizucRjxgU.
The same stream is also available on Facebook and on Twitch.

3. How to submit your questions?
Use the Youtube chat (or Facebook or Twitch chats) to submit your questions to the speakers. We will relay these questions at the end of the presentation.

4. How to replay the show?
After the live, the video will be available on https://devapps.ms or https://BlazorDay.net/live.

 

Saturday, May 16, 2020

Resume Building Workshop

The professional recruiters at TekSystems are hosting a Resume Building Workshop on May 20, 2020, Noon-1 PM EST.  This will be a virtual meeting and accessible by anyone from anywhere. 

 

·        Come learn more about resume building best practices

·        How to make your resume stand out

·        How to break down tips by skillset and targeted roles

·        Learn statistics about the IT job market

·        Get answers to questions from people who know hiring trends in the IT industry.

 

You may not need to send out your resume now, but you will eventually.  Better be prepared when the time comes!

 

Please register at https://www.eventbrite.com/e/virtual-it-resume-building-workshop-hosted-by-teksystems-free-event-tickets-105011010760

WebEx links will be sent 24 hours before the event!

 

If you have questions or issues registering, please reach out to Monica Darr at MLingler@teksystems.com

 

 

Friday, May 1, 2020

May 2020 Virtual Events

Despite the COVID-19 epidemic, technical events are still taking place.  Listed below are virtual events scheduled for this month.  Although these events are free, registration is required. 

May 7-8: Join the first ever SQL Server 2019 Virtual Symposium. Two days of training. Yeah, it’s free. https://bit.ly/sql_2019_vs_may2020

May 9: CouchCon Live: http://couchconlive.org/

May 12-13: https://groupby.org/: You can also view prior GroupBy sessions on YouTube: https://www.youtube.com/c/GroupbyOrg

May 16: SQL Saturday Cincinnati-Virtual: https://www.sqlsaturday.com/948/EventHome.aspx

May 28: Cleveland C#/VB.Net User Group: "Giving Sight To Applications" By Sam Nasr(NIS 

May 30: SQL Saturday Brisbane-Virtual: https://www.sqlsaturday.com/986/EventHome.aspx



Please don’t forget to sign up and join.