Man lär sig nya saker varje dag. Ibland saker som funnits framför en hela tiden utan att man vetat om det eller orkat ta reda på det. Så här kommer några tips och tricks över ett par av de lite mer dolda eller underanvända funktionerna som finns i VB, MSSQL och Visual Studio.
Block selection
En funktion jag tycker är händig att ha är att hålla ner ALT när jag väljer text i editorn, då blir det “block selection” istället för “row selection”. Bra att ha i många fall.
Imports Aliases
Man kan använda imports ihop med ett alias, antar att det är värdefullt om man har namespaces som krockar med varandra (Kommentera gärna om ni vet någon vettig anledning till att använda detta.)? Så här funkar det iaf:
Imports S = System.String
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'dimensionera upp X som en system.string
Dim x As S = "Hello"
'Använda system.string utifrån aliases
MsgBox(S.Format("Hello {0}", "Stefan"))
End Sub
End Class
Catch when
Man kan lägga till filtrering vid Try/Catch, finurligt och ganska underskattad feature:
Imports System.IO
Imports System.IO.File
Imports System.IO.Path
Public Class Form1
Public Function ReadFile(ByVal FileNameAndPath As String, Optional ByVal bRetry As Boolean = False) As String
Try
Return ReadAllText(FileNameAndPath)
Catch ex As FileNotFoundException When Not bRetry 'Prova igen, men bara en gång.
'Prova att leta efter filen i programkatalogen istället för medskickad path.
Dim TryPath As String = My.Application.Info.DirectoryPath & "\" & GetFileName(FileNameAndPath)
Return ReadFile(TryPath, True)
Catch ex As IOException
'Log exception
Return Nothing
End Try
End Function
End Class
Using
För att säkerställa att objekt dispose:as m.m. så är Using bra att använda. Speciellt vid filhantering, comportsläsning, grafikobjektshantering m.m.
Using går att använda på alla typer som implementerar IDisposable.Dispose.
Public Class Form1
Public Structure CustomerStruct
Implements System.IDisposable
Public FirstName As String
Public LastName As String
Public Age As Integer
Private disposed As Boolean
'Leker att customerstrukturen är IDisposable för att kunna använda using på Customerobjektet.
Public Overloads Sub Dispose() Implements IDisposable.Dispose
Dispose(True)
GC.SuppressFinalize(Me)
End Sub
Private Overloads Sub Dispose(ByVal disposing As Boolean)
If Not Me.disposed Then
' Rensa upp unmanaged resurser här
disposed = True
End If
End Sub
End Structure
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Using MyForm As New Form
MyForm.Text = "Nytt formulär"
MyForm.FormBorderStyle = Windows.Forms.FormBorderStyle.FixedDialog
If MyForm.ShowDialog(Me) = Windows.Forms.DialogResult.OK Then
'Wee, användaren klickade OK
Else
'Attans, användaren klickade inte OK!
End If
End Using
Using MyCustomer As New CustomerStruct With {.FirstName = "Stefan", .LastName = "Karlsson", .Age = 39}
End Using
End Sub
End Class
sp_msforeachtable
Riktigt trevlig funktion i MSSQL som gör att man kan köra ett kommando för varje tabell i databasen. I nedanstående rad så ersätts alltså frågetecknet med tabellnamnet. Så med en enda rad kan man loopa igenom alla tabeller och t.ex. som i nedanstående fall hämta en rad från varje tabell.
exec sp_msforeachtable "select top 1 * from ?"
Utöver sp_msforeachtable finns även sp_foreachdb som gör samma sak fast går igenom alla databaser på servern.
EXEC master..xp_fixeddrives
Ta reda på vilken hårddisk som har mest uttrymme kanske kan vara händigt?
Exempel på resultat:
drive MB free
----- -----------
C 24757
E 8217
(2 row(s) affected)
Döda alla connections till en databas
Use Master
Go
Declare @dbname sysname
Set @dbname = 'name of database you want to drop connections from'
Declare @spid int
Select @spid = min(spid) from master.dbo.sysprocesses
where dbid = db_id(@dbname)
While @spid Is Not Null
Begin
Execute ('Kill ' + @spid)
Select @spid = min(spid) from master.dbo.sysprocesses
where dbid = db_id(@dbname) and spid > @spid
End
Tipsa!
tipsa gärna om fler saker.