|
iam using vb.net2010 and phpmyadmin server onine ..
when i connect vb.net with phpmyadmin and execute query like this code
'--------------------
If mycon.State = ConnectionState.Closed Then
mycon.Open()
End If
Dim testid As Integer = 0
mydataAdapter = New MySqlDataAdapter("select ID from COMPANY order by ID DESC LIMIT 1", mycon)
mydataset = New DataSet
mydataAdapter.Fill(mydataset, "COMPANY")
If Me.BindingContext(mydataset, "COMPANY").Count > 0 Then
testid = mydataset.Tables("COMPANY").Rows(0).Item("ID")
End If
'------------------------------------------
...every thing work correctly with out any problem or warning..
but when i leave App (at running ) with out any action or event the problem rise
and tell me ("Fatal error encountered during command execution") ,
Note: the connection is open.
please help me
|
|
|
|
|
Unfortunately I am not familiar with any languages with a "V" in name...
Function zGetFolder( sFolder )
On Error Resume Next
Set zGetFolder = oFso.GetFolder( sFolder )
If Err.Number <> 0 Then
Wscript.Echo "Error connecting to: " & sFolder & VBlf & "[" & Err.Number & "]" & Err.Description
Wscript.Quit Err.Number
End If
End Function
Questions:
The line I don't understand is: Set zGetFolder = oFso.GetFolder(sFolder)
Why would you "Set" a call to oFso.GetFolder with "zGetFolder" the name of the function you are currently in???
I am also not quite sure what "On Error Resume Next" accomplishes with this construct.
|
|
|
|
|
In VBScript, if a function returns an instance of a class or any object, you have to SET the variable to that instance.
Also, "On Error Resume Next" is error handling, which would be a try/catch block in C#. Resume Next just tells VB to continue executing code even if an error occurs. It also sets the values of the Err object if an error does occur.
Basically, all that code boils down to this in C#:
var zGetFolder = new DirectoryInfo(sFolder);
You can find the documentation on the DirectoryInfo class here[^].
|
|
|
|
|
Thanks for the explanation. What you said makes perfect sense.
I still don't understand why you would do this:
Set zGetFolder = oFso.GetFolder( sFolder )
When zGetFolder is the name of the function that line of code is in.
Does this zGetFolder only exist in the scope of the function?
|
|
|
|
|
I think you'll find that the function is designed to return the folder to the calling method. Therefore
Steve Messer wrote: Set zGetFolder = oFso.GetFolder( sFolder ) should return the folder (it will be a variable in the calling function).
Never underestimate the power of human stupidity
RAH
|
|
|
|
|
Steve Messer wrote: When zGetFolder is the name of the function that line of code is in. That is how a function returns data to its caller. The name of the function is an alias for the name of the variable to return. So setting the name in that way, the caller of the function will receive the value obtained by GetFolder .
|
|
|
|
|
The GetFolder-Method comes from oFso. This must be declared somewhere else and means the FileSystemObject (Example : Set FSO = CreateObject("Scripting.FileSystemObject") ).
If you come from VBScript you will find a lot of differences (not only with the Code-Syntax) to .Net (it is independant if you take VB.NET or C#.Net).
modified 26-Feb-18 4:38am.
|
|
|
|
|
zGetFolder is NOT the name of a function. It's just a variable holding a value or, in this case, and object returned by the call to the GetFolder() function. The GetFolder() function is a member of the FileSystemObject class instance that the variable oFso holds.
|
|
|
|
|
So basically:
1. 'On Error Resume Next' turns on user error handling as the default behavior is to exit on errors
2. If the call to oFso.GetFolder returns an error the function will Echo out the error code and
continue execution instead of the normal behavior of exiting
This would make since as this is part of an ETL process which is just copying backups to a shared drive. The process doesn't need to stop if the shared drive is unavailable for some reason.
Thanks everyone!
|
|
|
|
|
Steve Messer wrote: the function will Echo out the error code and continue execution instead of the normal behavior of exiting
Not quite. The Wscript.Quit Err.Number line following the Wscript.Echo ... line will cause the script to quit, with no possibility for error handling code further up the stack to handle the error.
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
I didn't notice Wscript.Quit, In my mind I just saw to lines with Echo.
That takes all the mysteries out.
Thanks again!!
|
|
|
|
|
Dave Kreskowiak wrote: Basically, all that code boils down to this in C#:
Almost.
The GetFolder Method[^] generates an error if the folder doesn't exist. The DirectoryInfo constructor doesn't.
You'd need to check the Exists property, and either display a message or throw an exception if it returns False .
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Yeah, I know. There are other issues with the OP's understanding that I just didn't directly address because of time.
|
|
|
|
|
Hi,
I think, it's because of visual basic sripting (which is equal to VB 6)
The "SET" is for instancing the fso object ofso (Filesystem object i guess)
The on error resume next is a poor "try catch" implementation.
|
|
|
|
|
Hi All.
I Create a window form in which it have 4 tab.
Each time User click on a tab. I show some control in the form.
Which event is raise when user change the tab.
Thanks.
|
|
|
|
|
Please visit TabControl Class[^], especially the Remarks section near the end.
"I'm neither for nor against, on the contrary." John Middle
|
|
|
|
|
Maybe you look for the TabIndexChanged-Event ...
|
|
|
|
|
Hello
I am a non-programmer who has been asked to maintain Excel tools. I used Visual Studio Community 2017 to edit a vb file. In my organization, every 5th year is designated as having 53 weeks for financial reporting purposes. One of the tools contained code for the previous time we had a year with 53 weeks (2012). Two lines in the code contained a reference to 2012. I changed them to 2017 and and build the executable file. Now, when I run the executable, I get the following .NET error message
Can anyone see why changing the 53 week year value from 2012 to 2017 would cause this to fail, and what steps I would need to take to fix it?
Quote: ************** Exception Text **************
System.IndexOutOfRangeException: Index was outside the bounds of the array.
at VGProfilesAP9.dlgProfiler.Build_FromToLists() in C:\Users\3811\Desktop\AP9 40 STORES TWO\AP9\VGProfilesAP9\VGProfilesAP9\Profiler.vb:line 156
at VGProfilesAP9.dlgProfiler.Profiler_Load(Object sender, EventArgs e) in C:\Users\3811\Desktop\AP9 40 STORES TWO\AP9\VGProfilesAP9\VGProfilesAP9\Profiler.vb:line 84
at System.EventHandler.Invoke(Object sender, EventArgs e)
at System.Windows.Forms.Form.OnLoad(EventArgs e)
at System.Windows.Forms.Form.OnCreateControl()
at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
at System.Windows.Forms.Control.CreateControl()
at System.Windows.Forms.Control.WmShowWindow(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
at System.Windows.Forms.Form.WmShowWindow(Message& m)
at System.Windows.Forms.Form.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
Here is an excerpt of the vb code that contains the two lines referenced above.
Line 84 is the "Profiler_Load" subroutine: Build_FromToLists()
Line 156 is in "Build_FromToLists()" subroutine: wkList(wkIndex) = CStr(yr) & " Wk" & Format(wk, "00")
<pre>
Public Class dlgProfiler
Dim storeCount As Integer
Dim IsInit As Boolean = False
Dim nmeArr(0 To 999) As String
Dim importVGArr(0 To 999) As String
Dim totSales As Double = 0
Dim nodeFound As Boolean
Dim nodecount As Long
Dim WK1, WKL, bWK1, bWKL As Int32
Dim webSales As Double
Dim EditMode As Boolean = False
Dim SavedProfID As Integer = 0
Dim HNRID_IN As String
Private Sub Profiler_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim defaultVGDB9 = GetSetting("AsstPlan", "Settings", "DefaultVGP9db", "")
Select Case UCase(Mid(System.Environment.GetEnvironmentVariable("SessionName"), 1, 3))
Case "CON"
MY_AP9_PATH = Application.StartupPath
If File.Exists(defaultVGDB9) Then
If defaultVGDB9 = MY_AP9_PATH & "\MyVGP9.accdb" Then
Me.optProfileDB_ThisComputer.Checked = True
SharedProfileDatabase = GetSetting("AsstPlan", "Settings", "SharedVGP9db", "")
If File.Exists(SharedProfileDatabase) Then
optProfileDB_Shared.Text = "Shared AP9 Profiles (from " & SharedProfileDatabase & ")"
Else
optProfileDB_Shared.Text = "Shared AP9 Profiles (currently not linked - click to search)"
SaveSetting("AsstPlan", "Settings", "SharedVGP9db", "")
End If
Else
Me.optProfileDB_Shared.Checked = True
optProfileDB_Shared.Text = "Shared AP9 Profiles (from " & defaultVGDB9 & ")"
SaveSetting("AsstPlan", "Settings", "SharedVGP9db", defaultVGDB9)
optProfileDB_Shared.Text = "Shared AP9 Profiles (from " & defaultVGDB9 & ")"
SharedProfileDatabase = defaultVGDB9
End If
cmdSharedDBFind.Left = optProfileDB_Shared.Right + 10
cmdSharedDBCreate.Left = optProfileDB_Shared.Right + 100
CurrentProfileDatabase = defaultVGDB9
Else
If File.Exists(MY_AP9_PATH & "\MyVGP9.accdb") Then
CurrentProfileDatabase = MY_AP9_PATH & "\MyVGP9.accdb"
SaveSetting("AsstPlan", "Settings", "DefaultVGP9db", CurrentProfileDatabase)
Else
If MsgBox("An AP9 profiles database file has not been installed this computer yet. A new blank file will be opened in the asst planning " &
"folder." & vbCrLf & vbCrLf & "If you click cancel, the profiler application will terminate without creating that file.",
vbOKCancel + vbExclamation, "AP9 Profile Datafile Not Found") = vbOK Then
If File.Exists(AP_PATH & "MyVGP9.accdb") = True Then
File.Copy(AP_PATH & "MyVGP9.accdb", MY_AP9_PATH & "\MyVGP9.accdb")
CurrentProfileDatabase = MY_AP9_PATH & "\MyVGP9.accdb"
SaveSetting("AsstPlan", "Settings", "DefaultVGP9db", CurrentProfileDatabase)
Else
MsgBox("Cannot connect to public drive to create file. Application will end", vbOKOnly + vbCritical, "Not connected")
End
End If
Else
End
End If
End If
End If
Case "ICA"
If File.Exists(defaultVGDB9) Then
CurrentProfileDatabase = defaultVGDB9
Else
If MsgBox("When working through Citrix, only 'Shared' profiles database files are available. (Shared files are stored on a network drive like the I:\ drive.) " & _
"Have you already created a shared database on the I:\ drive?", MsgBoxStyle.YesNo + MsgBoxStyle.Question, "Shared VG Profiles Database") = vbYes Then
If FindSharedProfileDB() = False Then End
Else
If MsgBox("Do you want to create one? (Yes to create a new file, No toexit the application)", MsgBoxStyle.YesNo + MsgBoxStyle.Question, "Create New Shared VG9 Database") = vbYes Then
CreateSharedVGDB()
Else
End
End If
End If
End If
End Select
cnMID = New ADODB.Connection
cnMID.Open("DRIVER={SQL SERVER};SERVER=Mid.sqldb.prod.myco.com;DATABASE=MID", "User", "user")
InitStoreNames()
BuildVersionList()
Build_SeasonYearLists()
Build_FromToLists()
BuildUserList()
GR3.RowTemplate.Height = 18
SetGrids(300)
SetToolTips()
LoadMyProfiles()
End Sub
Public Sub SetToolTips()
Dim toolTips As New ToolTip()
toolTips.AutoPopDelay = 8000
toolTips.InitialDelay = 1000
toolTips.ReshowDelay = 500
toolTips.ShowAlways = True
toolTips.SetToolTip(cmdImport_Excel, "Create and open an Excel sheet with 3 colums with Store, Sales, and optionally Vgroup letter A-O")
toolTips.SetToolTip(cmdCopyVG, "Allows you to copy profile to/ from a shared profiles file to the file on your computer.")
End Sub
Private Sub dlgProfiler_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
cnMID.Close() : cnMID = Nothing
End Sub
Private Sub InitStoreNames()
Dim RSS As New ADODB.Recordset
Dim SQL1 As String = "SELECT ST_ID, STORE_NAME FROM dbo.STORES ORDER BY ST_ID ASC"
RSS.Open(SQL1, cnMID, 3, 1, 1)
Do Until RSS.EOF
If Val(RSS.Fields("ST_ID").Value) > 0 Then
nmeArr(RSS.Fields("ST_ID").Value) = RSS.Fields("STORE_NAME").Value
End If
RSS.MoveNext()
Loop
RSS.Close()
End Sub
Private Sub BuildVersionList()
Dim RSV As New ADODB.Recordset
Dim SQL1 As String = "SELECT dbo.FORECAST_VERSION.FV_RID, dbo.FORECAST_VERSION.DESCRIPTION From dbo.FORECAST_VERSION WHERE (((dbo.FORECAST_VERSION.FV_ID) IN('A','C','Z'))) ORDER BY dbo.FORECAST_VERSION.DESCRIPTION ASC"
RSV.Open(SQL1, cnMID, 3, 1, 1)
Dim vList As New ArrayList
Dim vListB As New ArrayList
Do Until RSV.EOF
vList.Add(New MIDVersion(RSV.Fields(1).Value, RSV.Fields(0).Value))
vListB.Add(New MIDVersion(RSV.Fields(1).Value, RSV.Fields(0).Value))
RSV.MoveNext()
Loop
cboH_PlanVersion.DataSource = vList
cboH_PlanVersion.DisplayMember = "Version_Name"
cboH_PlanVersion.ValueMember = "Version_Code"
RSV.Close() : RSV = Nothing
cboH_PlanVersion.SelectedIndex = 2
End Sub
Private Sub Build_FromToLists()
Dim wkList(0 To 207) As String
Dim year1 As Integer = Year(Now) - 2
Dim wkIndex As Integer = 0
Dim currFweek As Long = MID_GetCurrFiscalWeek()
Dim currFweekIndex As Integer = 0
For yr = year1 To year1 + 3
If yr = 2017 Then
For wk = 1 To 53
wkList(wkIndex) = CStr(yr) & " Wk" & Format(wk, "00")
If (yr * 100) + wk = currFweek Then currFweekIndex = wkIndex
wkIndex += 1
Next wk
Else
For wk = 1 To 52
wkList(wkIndex) = CStr(yr) & " Wk" & Format(wk, "00")
If (yr * 100) + wk = currFweek Then currFweekIndex = wkIndex
wkIndex += 1
Next wk
End If
Next yr
cboTime_From.Items.AddRange(wkList)
cboTime_To.Items.AddRange(wkList)
If currFweekIndex > 0 Then
cboTime_From.SelectedIndex = currFweekIndex - 1
cboTime_To.SelectedIndex = currFweekIndex
End If
End Sub
|
|
|
|
|
Member 13693556 wrote:
Dim wkList(0 To 207) As String
You've declared an array of 208 elements, but you're trying to store 209 elements in it.
- 2016: 52 elements;
- 2017: 53 elements
- 2018: 52 elements
- 2019: 52 elements
- 52 + 53 + 52 + 52 = 209
Change the array declaration:
Dim wkList(0 To 208) As String
Also, rather than recompiling the code every five years, you can calculate whether the year needs 53 weeks:
If (yr - 2012) Mod 5 = 0 Then
Else
End If Mod Operator (Visual Basic) | Microsoft Docs[^]
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Hello Richard
Thank you so much for figuring this out, and for the very useful explanation, and for the idea on how to eliminate the manual edit every time there is a 53 week year. I made then edit, then decided I better confirm my "every 5 years" comment. Looking at the National Retail Federation website where the 4-5-4 calendar is published, I saw that the frequency of 53 week years is not necessarily every 5 years. Most recent examples of 53 week years were:
1995
2000
2006
2012
2017
Because it is not a sure thing for a 53 week every five years, I restored the old code. But thanks for the suggestion, and thanks so much for sorting out the issue, and explaining how to calculate what would be needed going forward. I really appreciate the help.
One question, from the lines in the error message, how did you know to target the array declaration as being the source of the problem?
Kenn
modified 23-Feb-18 21:34pm.
|
|
|
|
|
OK, it looks like you're using the "first full week" rule, with weeks starting on Sunday.
Private Shared Function NumberOfWeeksInYear(ByVal year As Integer) As Integer
Dim lastDayOfYear As New Date(year, 12, 31)
Return System.Globalization.CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(lastDayOfYear, System.Globalization.CalendarWeekRule.FirstFullWeek, DayOfWeek.Sunday)
End Function
Private Sub Build_FromToLists()
Dim wkList(0 To 208) As String
Dim year1 As Integer = Year(Now) - 2
Dim wkIndex As Integer = 0
Dim currFweek As Long = MID_GetCurrFiscalWeek()
Dim currFweekIndex As Integer = 0
For yr = year1 To year1 + 3
Dim weeksInYear As Integer = NumberOfWeeksInYear(yr)
For wk = 1 To weeksInYear
wkList(wkIndex) = CStr(yr) & " Wk" & Format(wk, "00")
If (yr * 100) + wk = currFweek Then currFweekIndex = wkIndex
wkIndex += 1
Next wk
Next yr
cboTime_From.Items.AddRange(wkList)
cboTime_To.Items.AddRange(wkList)
If currFweekIndex > 0 Then
cboTime_From.SelectedIndex = currFweekIndex - 1
cboTime_To.SelectedIndex = currFweekIndex
End If
End Sub
Member 13693556 wrote: One question, from the lines in the error message, how did you know to target the array declaration as being the source of the problem?
The error message said "Index was outside the bounds of the array". The line it was thrown from only had a single array access, to wkList . From there, it was just a case of working out the maximum value for wkIndex , and comparing it to the declared length of the array.
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Thanks again for the explanation. It seems the tool was written with the understanding that the array value would require intermittent maintenance.
The author of the tool had been planning on a 3 year transition and knowledge transfer to coincide with his planned departure from the company. When his departure was accelerated by three years, the (unwritten) system documentation walked out the door with him - so I really appreciate the help.
|
|
|
|
|
I populate a list box with files from a file search. Then I can select a file from the list box and open it with a certain program. If I select a second file from the list box and open it, it starts another instance of the program. These are text files I am opening in a text editor. What I want to do is if the text editor is already running just open the new file in the already opened program. The extensions can be anything so I cannot associate them to this file editor. (too numerous) I know how to find out if the program is running, just not how to add another file to it. Here is code that I have been using to find out if the program is open and if not start the file in the program. This works fine but what I want to do is instead of showing message box if the process is running, is open the file in it without staring another instance of it.
Dim ProcessIsRunning As Boolean = Process.GetProcessesByName("editcnc").Length > 0
If ProcessIsRunning = True Then
MessageBox.Show("EditCNC already Running")
Else
openf = """" & openf & """"
Process.Start(editFile.Text, openf)
End If
modified 22-Feb-18 15:55pm.
|
|
|
|
|
You have a problem. Not every application can handle opening another document while it's already running, like Notepad can't do that.
Not every application exposes any kind of interface to be able to programatically support opening multiple documents. Word, Excel, and most other Office apps, supports doing this as they expose COM interfaces to be able to communicate with them. Most applications don't support this. You'd also have to write code specifically against every application you'd want to support. There is no such thing as a "one interface works with all" here.
Some applications may support opening other documents through command line arguments. Launch another copy of the application and it will automatically talk to the already running copy to tell it to open the new document. Not every application supports this and, again, there is no "one command line works for all apps" here either.
There is no way to support every app generically. The only workable solution you have is to simple launch the document you're trying to open. The application associated with that file extension will open the document however it is supported, either by launching another copy of the application or by telling the the already running copy of the app to open it.
YOU WILL HAVE NO CONTROL OVER HOW THIS PROCESS WORKS, NOR CAN YOU GET CONTROL OVER IT!
modified 23-Feb-18 8:04am.
|
|
|
|
|
Thanks for your reply, Dave. The program I am working with, "EditCNC" does support opening multiple documents at one time. In my program I am giving the option to open the files with EditCNC, Word, or Wordpad. I am not as concerned about opening multiple files with Word or Wordpad, just with EditCNC. I am new at this but am wondering if you could elaborate more on the COM interface you had mentioned.
Thanks.
|
|
|
|
|